如何阻止异步调用完成?

Jer*_*emy 1 .net c# asynchronous

我有一个调用异步方法的方法,以及异步方法完成时触发的回调.

我希望我的方法看起来是同步的,所以我创建了一个AutoResetEvent,称为asyncrhonous方法,在AutoResetEvent实例上调用WaitOne(),我在回调方法中调用Set().像这样的东西(本例简化):

private System.Threading.AutoResetEvent waitRun_m;
public void RunSynchronous()
{
    waitRun_m = new System.Threading.AutoResetEvent(false);
    CallAsynchronousMethod();

    waitRun_m.WaitOne();
}

private void Callback()
{
    waitRun_m.Set();
}
Run Code Online (Sandbox Code Playgroud)

现在,是否可以在调用WaitOne()之前完成对CallAsynchronousMethod的调用 - 导致在WaitOne()之前调用Set().有没有更好的方法来做到这一点,以避免这个潜在的问题?

Dan*_*sky 7

我相信这会回答你的问题:

调用Set信号AutoResetEvent释放等待线程.AutoResetEvent保持信号状态,直到释放单个等待线程,然后自动返回到非信号状态.如果没有线程在等待,则状态将无限期地发出信号.

但是,您必须小心,因为现在RunSynchronous看起来不是线程安全的.如果两个不同的线程以重叠方式调用它,那么一切都会破裂.