【问题标题】:How to use async operation in IO-Bound with TaskCompletionSource?如何在具有 TaskCompletionSource 的 IO-Bound 中使用异步操作?
【发布时间】:2021-04-13 11:11:08
【问题描述】:

我想在 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;
}

【问题讨论】:

  • 什么是动作?它在很大程度上取决于动作的底层实现,而不是你可以在不消耗线程的情况下透明地转换。

标签: c# .net asynchronous taskcompletionsource


【解决方案1】:

您可以使用Task.Run(() =&gt; action()),但在后台它会将其委托给ThreadPool。而且ThreadPool 不一定会创建一个全新的Thread,它通常有一些线程正在被重用。

【讨论】:

  • 这与ThreadPool.QueueUserWorkItem 有何不同,ThreadPool 也应该重用线程?我高度怀疑 OP 希望在等待响应时以某种方式执行 IO 绑定操作而不消耗线程。
  • 它不会有任何不同,这就是为什么我说这两个东西几乎做同样的事情,唯一的区别是他正在用TaskCompletionSource编写样板代码。
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多