关于解除阻塞的ManualResetEvent不一致行为

时间:2014-02-10 16:36:23

标签: c# multithreading

我面临的当前问题是,虽然ManualResetEvent设置了,但偶尔会有等待线程继续进行。

所以在ClassA中我有以下代码片段:

private ManualResetEvent readyEvent = new ManualResetEvent(false);

public async Task Run(CancellationToken cancellationToken)
{
    try
    {
        await RunAt(...);
        readyEvent.Reset();
    }
    catch (Exception e)
    {
        var onRequiresRestartEvent = RequiresRestartEvent;

        if (onRequiresRestartEvent != null)
        {
            ThreadPool.QueueUserWorkItem(obj=>onRequiresRestartEvent(this,
            EventArgs.Empty));
        }
    }
}

private IEnumerable<string> ListStuff(Match match)
{
    // Do some stuff
    readyEvent.Set();
}

在ClassB中,我有一个方法:

public override void WaitUntilReady(int timeoutMilliseconds)
{
    if (!classA.ReadyEvent.WaitOne(timeoutMilliseconds)) // wait 
    {
        throw new TimeoutException("Timeout waiting for the modem");
    }
    classA.ReadyEvent.Reset();
}

我在ClassA.ListStuff上放了一个断点,而readyEvent.Set()确实已经执行但由于某种原因,程序执行没有超过ClassB中的.WaitOne。

此代码有什么明显错误吗?如果没有,我可以采取哪些步骤来调试此问题?

0 个答案:

没有答案