【发布时间】:2019-09-12 21:53:52
【问题描述】:
我无法控制来自 API 的以下方法。
public void Start(Action OnReady);
总的来说,我对回调很好,但有时你有触发回调的回调等等。因此,我想将它包装到异步方法中,并且可能还包括取消操作的可能性。像这样的:
await Start(cancellationToken);
这是我想出的:
public Task Start(CancellationToken cancellationToken)
{
return Task.Run(() =>
{
cancellationToken.ThrowIfCancellationRequested();
var readyWait = new AutoResetEvent(false);
cancellationToken.Register(() => readyWait?.Set());
Start(() => { readyWait.Set(); }); //this is the API method
readyWait.WaitOne();
readyWait.Dispose();
readyWait = null;
if(cancellationToken.IsCancellationRequested)
{
APIAbort(); //stop the API Start method from continuing
cancellationToken.ThrowIfCancellationRequested();
}
}, cancellationToken);
}
我认为还有改进的余地,但我想到的一件事是这种方法在这种情况下有什么作用?
readyWait.WaitOne();
我想编写一个异步方法来不阻塞任何线程,但这正是 WaitOne 所做的。当然它不会因为任务而阻塞调用线程,但是任务是否获得了自己的线程?如果只有任务会被阻止我会很好,但我不想阻止可能在其他地方使用的线程。
【问题讨论】:
-
一个回调已经是异步的,那么为什么要在异步方法中包装一个异步方法呢?任何事件都不应阻塞。阻塞在主线程中完成。一个事件通常运行最少的代码然后返回。
-
你可以使用TaskCompletionSource,stackoverflow.com/questions/15316613/…
标签: c# async-await