Каков синхронный эквивалент 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 ответ

Решение

Вы можете просто объявить локальную переменную, установить ее в обратном вызове, а затем вернуть ее.

Другие вопросы по тегам