等待句柄回调

时间:2017-08-23 08:27:03

标签: c# asynchronous callback

要异步从服务器获取数据,我使用getData.BeginInvoke(callback, null),其中getData是获取数据的方法。 callback做了一些工作&检索数据的通知。

在一个调用方法中,我已经读过好的做法是使用WaitHandle等待方法完成。我的问题是:WaitHandle是否也等待回调完成?如果没有,该怎么做?

代码:

Func<Data> getData = () => 
{
    //... 
};

AsyncCallback callback = (IAsyncResult ar) => 
{
    //... 
};

IAsyncResult result = getData.BeginInvoke(callback, null);

result.AsyncWaitHandle.WaitOne();

注1:我必须使用框架3.5,因此我无法使用async&amp; await

注意2:我不认为这个问题与this post重复。

1 个答案:

答案 0 :(得分:2)

你是对的,WaitOne意味着BeginInvoke的目标已经完成,但它不能保证回调的完成。在这种情况下,您必须使用ManualResetEvent才能自己手动处理它:

    Func<Data> getData = () =>
    {
        //...
    };
    AsyncCallback callback = (IAsyncResult ar) =>
    {
        // do your thing...
        getData.EndInvoke(ar);
        waiter.Set();
    };

    ManualResetEvent waiter;

    void DoWork()
    {
        waiter = new ManualResetEvent(false);
        IAsyncResult result = getData.BeginInvoke(callback, null);
        waiter.WaitOne();
        //Callback has finished
    }