我面临的当前问题是,虽然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。
此代码有什么明显错误吗?如果没有,我可以采取哪些步骤来调试此问题?