2012-02-21 75 views
1

我有兩種類似的方法,在MainThreadDoWork方法中,循環完成執行,不管OtherThreadWork方法中的autoResetEvent.Set()如何。任何想法在這個AutoResetEvent實例中發生了什麼?AutoResetEvent發出信號之前觸發

AutoResetEvent autoResetEvent = new AutoResetEvent(true); 
private int count = 10; 

private void MainThreadDoWork(object sender, EventArgs e) 
{ 
    for (int i = 0; i < count; i++) 
    { 
     if (autoResetEvent.WaitOne()) 
     { 
      Console.WriteLine(i.ToString()); 
     } 
    } 
} 

private void OtherThreadWork() 
{ 
    autoResetEvent.Set(); 
    //DoSomething(); 
} 

編輯

下面是OtherThreadWork如何實際樣子。

private void OtherThreadWork() 
    { 
     if (textbox.InvokeRequired) 
     { 
      this.textbox.BeginInvoke(new MethodInvoker(delegate() { OtherThreadWork(); })); 
      autoResetEvent.Set(); 
     } 
     else 
     { 
      // Some other code 
     } 
    } 
+1

東西是腥這裏,我懷疑實際的代碼有一些其他的問題。我在我的機器上運行了這段代碼,並阻止了對'WaitOne'的調用。 – Tudor 2012-02-21 11:19:54

+0

@Tudor:我發佈了實際的otherThreadWork方法。有什麼想法發生了什麼?謝謝! – ABCD 2012-02-21 12:25:05

+0

'MainThreadDoWork'正在UI線程上執行? – Tudor 2012-02-21 12:43:48

回答

3

傳遞給AutoResetEvent構造函數的布爾參數指定是否在信號狀態下創建事件。

您正在創建它已處於信號狀態,因此您的第一個WaitOne不會阻止。

嘗試:

AutoResetEvent autoResetEvent = new AutoResetEvent(false); 
+0

注意10次迭代的循環。在第一個WaitOne之後,waithandle將被設置爲unsignalled,所以它應該只打印一個0並且此後永遠等待(給出示例代碼) – Polity 2012-02-21 10:42:49

+0

@Polity是 - 我假設這只是一個示例。如果他有10個線程運行'OtherThreadWork',那麼他也會錯過信號。 – 2012-02-21 10:48:45

+0

@NicholasButler:它被設置爲true,以執行第一次迭代。我的問題是爲什麼它在不等待其他線程信號的情況下繼續進行所有迭代。只有2個線程正在運行,主線程和另外一個線程。 – ABCD 2012-02-21 11:06:17