AutoResetEvent在信号之前触发

时间:2012-02-21 10:34:27

标签: c# .net multithreading c#-4.0 autoresetevent

我有两种类似于下面的方法。在MainThreadDoWork方法中,无论OtherThreadWork方法中的autoResetEvent.Set()如何,循环都将完成执行。知道这个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 个答案:

答案 0 :(得分:4)

传递给AutoResetEvent构造函数的布尔参数指定是否在信号状态下创建事件。

您已在信号状态下创建它,因此您的第一个WaitOne不会阻止。

尝试:

AutoResetEvent autoResetEvent = new AutoResetEvent( false );