C # Синхронное выполнение асинхронного вызова - PullRequest
4 голосов
/ 22 января 2011

У меня есть библиотека, которая позволяет только асинхронные вызовы, мой код должен быть синхронным. Будет ли следующий код работать правильно? Может ли кто-нибудь предвидеть какие-либо проблемы с этим?

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 ]

8 голосов
/ 22 января 2011

Не опрашивать.Используйте встроенные средства синхронизации.

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

executedCallBack.WaitOne();
//continue execution synchronously

В качестве примечания мне пришлось изменить порядок операций внутри обратного вызова.В вашем примере было условие состязания, поскольку флаг мог позволить основному потоку продолжить и попытаться прочитать ответ до того, как поток обратного вызова его написал.

2 голосов
/ 22 января 2011

Обычно асинхронные вызовы возвращают какой-то токен (например, IAsyncResult ), который позволяет вам просто подождать его без опроса.Ваш API вообще этого не делает?

Другой вариант - использовать ManualResetEvent или Monitor.Wait / Pulse вместо цикла сна.

...