要异步从服务器获取数据,我使用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重复。
答案 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
}