什么是 TaskCompletionSource 的同步等价物

本文关键字:同步 等价物 TaskCompletionSource 什么 | 更新日期: 2023-09-27 18:35:23

我有一个这样的方法:

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导数,但代码隐藏看起来很奇怪,所以我不能相信它。谁能想到一种方法来做到这一点?

什么是 TaskCompletionSource<T> 的同步等价物

您可以简单地声明一个局部变量,在回调中设置它,然后返回它。