2010-04-30 2 views
4

BackgroundWorker가있는 Windows Forms 응용 프로그램이 있습니다. 기본 폼의 메서드에서 MessageBox가 표시되고 계속하려면 [확인] 단추를 클릭해야합니다. 한편, messagebox가 표시되는 동안 BackgroundWorker는 실행을 완료하고 RunWorkerCompleted 이벤트를 호출합니다. UI 스레드에서 실행되는 해당 이벤트에 할당 된 메서드에서 Close 메서드가 폼에 호출됩니다. 메시지 상자를 표시하는 메서드가 계속 실행 중이더라도 UI 스레드는 다른 스레드에서 스레드를 호출하지 못하도록 차단하지 않습니다. 그래서 Close 메서드가 폼에서 호출됩니다. 내가 원하는 것은 UI 스레드가 메시지 상자가있는 메서드가 끝날 때까지 다른 스레드의 호출을 차단하는 것입니다. 쉽게 할 수있는 방법이 있습니까?C# 또는 .NET에는 다른 스레드가 특정 스레드에서 메서드를 호출하지 못하게하는 방법이 있습니까?

답변

1

나는 생각한다 당신은 당신의 사건들이 어떻게 다루어지고 있는지에 관해 더 많은 훈련을 받아야합니다. 메서드 호출 메커니즘은 마우스 및 키보드 이벤트 같은 것을 허용하는 메커니즘과 동일하기 때문에 UI 스레드에서 호출되는 메서드를 중지하고 싶지는 않습니다. 메서드 호출을 차단하면 해당 메서드 호출도 차단됩니다. 대신 방법을 어떻게 든 지연시켜야합니다. 이렇게하려면 자체 동기화 코드를 작성해야 할 수 있습니다.

0

ManualResetEvent를 사용하여 RunWorkCompleted 이벤트와 MessageBox를 표시하는 메서드 간의 동기화를 제어합니다.

0

간단한 lock을 사용할 수 있습니다. (

private void RunWorkerCompleted() 
{ 
    lock (_locker) 
    { 
     this.Close(); 
    } 
} 

private void ShowSomeMessage() 
{ 
    lock (_locker) 
    { 
     MessageBox.Show("message"); 
    } 
} 

코드가 현재 ShowSomeMessage()에 차단하는 경우 :

private object _locker = new object(); 

그런 다음 코드는 다음과 같이 두 가지 방법으로 잠금을 획득 한 : 양식에서이 같은 폼 수준 멤버를 만들 즉 메시지 상자가 아직 열려있는 경우) RunWorkerCompleted() 메서드는 양식을 닫기 전에 메시지 상자가 닫힐 때까지 (잠금 해제) 대기합니다.

업데이트 :이있는 스레드의 호출에 관계없이 작동해야하는지 :

private bool _showingMessage = false; 

그런 다음 코드는 다음과 같이 두 가지 방법으로 잠금을 획득 한 :

private void RunWorkerCompleted() 
{ 
    while (_showingMessage) 
    { 
     Thread.Sleep(500); // or some other interval (in ms) 
    } 
    this.Close(); 
} 

private void ShowSomeMessage() 
{ 
    _showingMessage = true; 
    MessageBox.Show("message"); 
    _showingMessage = false; 
} 
+0

이것은 처음에 시도한 것입니다. 그러나 그것은 두 스레드가 동일한 스레드에서 실행되기 때문에 작동하지 않았습니다. 그리고 RunWorkerCompleted()가 lock 문에 도달하면 실행중인 스레드가 이미 잠금을 가지고 있기 때문에 차단하지 않습니다. 내가 틀렸다면 나를 바로 잡아주세요. – YWE

+0

이러한 메소드 중 하나가'Invoke' 또는'BeginInvoke'를 통해 호출되지 않는다면 올바르게 작동하지 않습니다. 메시지 상자가 버튼 클릭으로 표시되는 경우 이는 UI 스레드 (백그라운드 스레드와 다름)에 표시됩니다. – MusiGenesis

+0

나는 두 번째 방법도 시도했다. 그것은 일종의 작품입니다. 그러나 Stewert가 언급 한 문제로 고통 받고 있습니다. UI 스레드는 마우스 클릭에 응답 할 수 없으므로 사용자는 확인을 클릭 할 수 없습니다. 일종의 "교착 상태"가 발생합니다. – YWE

관련 문제