问题描述
我想在 IO-Bound 中实现一个异步机制,我如何在不消耗新线程的情况下使用 taskcompletionsource 实现它?
以下示例在线程池中创建新线程,但我正在寻找 taskcompletionsource 的新方法 无需在线程池中创建新线程?!
public static Task RunAsync(Action action)
{
var tcs = new taskcompletionsource<Object>(TaskCreationoptions.runcontinuationsAsynchronously);
ThreadPool.QueueUserWorkItem(_ =>
{
try
{
action();
tcs.SetResult(null);
}
catch(Exception exc) { tcs.SetException(exc); }
});
return tcs.Task;
}
解决方法
您可以使用 Task.Run(() => action())
,但在幕后它会将其委托给 ThreadPool
。而且 ThreadPool
不一定会创建一个全新的 Thread
,它通常有一些正在被重用的线程。