Каков синхронный эквивалент TaskCompletionSource<T>?
У меня есть метод, который выглядит так:
Task<MyClass> MyMethodAsync()
{
SendBluetoothMessageAsync();
var tcs = new TaskCompletionSource<MyClass>();
Bluetooth.MessageRecieved += (o, e) => tcs.SetResult(e.SomeProperty);
//this removes itself afterwards, but boilerplate removed
return await tcs.Task;
}
Однако для моего API мне нужно предложить синхронную альтернативу. Поэтому мне нужен объект, который может подождать, пока не появится сигнал, но может нести объект. AutoResetEvent почти соответствует моим критериям, и вот что я получил до сих пор:
MyClass MyMethodAsync()
{
SendBluetoothMessage();
var are = new AutoResetEvent();
Bluetooth.MessageRecieved += (o, e) => are.Set(); //removes itself too
return null; //problem: how do I get the result?
}
Однако мне нужно получить результат. Я не вижу способа сделать это. Я думал сделать EventWaitHandle
производная, но кодовая часть выглядела отчетливо странно, поэтому я не мог этому доверять. Кто-нибудь может придумать способ сделать это?
1 ответ
Решение
Вы можете просто объявить локальную переменную, установить ее в обратном вызове, а затем вернуть ее.