2012-02-21 47 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