我有一个只允许异步调用的库,我的代码需要同步。以下代码是否正常工作?任何人都可以预见到它的任何问题吗?
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
答案 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根本不这样做吗?
另一种选择是使用ManualResetEvent
或Monitor.Wait
/ Pulse
代替睡眠循环。