自定义线程的await / async的用法(和优点)

时间:2014-05-26 05:13:56

标签: c# .net multithreading asynchronous async-await

我正在编写一些执行某些Web请求的代码,操作答案并将结果返回给调用者。在我看来,异步/等待的自然环境。 这是我写的方法:

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

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

  • 在不来自线程池的线程上使用async / await是否有优势?
  • 如何从现有代码的上下文中调用root方法? (见例)
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真的有意义吗?我能获得福利吗?

1 个答案:

答案 0 :(得分:3)

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

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