wait/async与自定义线程的用法(及其优点)

本文关键字:用法 async 自定义 线程 wait | 更新日期: 2023-09-27 18:05:12

我正在编写一些代码,用于处理一些web请求、处理答案并将结果返回给调用者。在我看来,这是async/await的自然上下文。这是我写的方法:

protected async Task<ProcessingResult> ProcessWebPagesAsync(/* args */)
{
    // awaits and other code here
}

调用程序在专门为运行这些请求而创建的线程上运行,我目前无法更改实现。我的问题是:

  • 在非来自线程池的线程上使用async/await有什么好处吗
  • 如何从现有代码的上下文中调用根方法?(参见示例(
public class MyProcessor : ProcessorBase
{
    public override ProcessingResult ProcessWebPages(/* args */)
    {
        return this.ProcessWebPagesAsync(/* args */).Result;
    }
    protected async Task<ProcessingResult> ProcessWebPages(/* args */)
    {
        // awaits and other code here
    }
}

因此,ProcessorBase.ProcessWebPages()是在一个"专用"线程上调用的。在这里使用async/await真的有意义吗?我有福利吗?

wait/async与自定义线程的用法(及其优点)

async/await与I/O绑定操作一起使用的好处是,您可以避免分配专用Thread的成本,这将主要阻止等待网络硬件返回响应。当您await时,当返回响应时,工作正在处理并通过IOCP池回调,您可以设置您希望方法(Continuation(的其余部分在哪里运行(Threadpool线程、UI线程等(

我认为在专用线程上运行ProcessorBase.ProcessWebPages没有什么特别的好处。如果可以的话,您应该避免为您的工作分配这样的线程,而是使用纯async。我还建议坚持异步方法命名的约定,并将方法名称更改为ProcessorBase.ProcessWebPagesAsync