C#同步进行异步调用

时间:2011-01-22 17:05:26

标签: c# multithreading asynchronous

我有一个只允许异步调用的库,我的代码需要同步。以下代码是否正常工作?任何人都可以预见到它的任何问题吗?

RestResponse<T> response = null;
bool executedCallBack = false;
client.ExecuteAsync(request, (RestResponse<T> aSyncResponse)=>{
    executedCallBack = true;
    response = aSyncResponse;
});

while (!executedCallBack){
    Thread.Sleep(100);
}
..continue execution synchronously

2 个答案:

答案 0 :(得分:8)

不要投票。使用内置的同步功能。

RestResponse<T> response = null;
var executedCallBack = new AutoResetEvent(false);
client.ExecuteAsync(request, (RestResponse<T> aSyncResponse)=>{
    response = aSyncResponse;
    executedCallBack.Set();
});

executedCallBack.WaitOne();
//continue execution synchronously

作为旁注,我必须在回调中切换操作的顺序。您的示例有一个竞争条件,因为该标志可以允许主线程继续,并尝试在回调线程写入之前读取响应。

答案 1 :(得分:2)

通常异步调用会返回某种令牌(例如IAsyncResult),让您只需等待它,而无需轮询。你的API根本不这样做吗?

另一种选择是使用ManualResetEventMonitor.Wait / Pulse代替睡眠循环。