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真的有意义吗?我有福利吗?
将async/await
与I/O绑定操作一起使用的好处是,您可以避免分配专用Thread
的成本,这将主要阻止等待网络硬件返回响应。当您await
时,当返回响应时,工作正在处理并通过IOCP池回调,您可以设置您希望方法(Continuation(的其余部分在哪里运行(Threadpool线程、UI线程等(
我认为在专用线程上运行ProcessorBase.ProcessWebPages
没有什么特别的好处。如果可以的话,您应该避免为您的工作分配这样的线程,而是使用纯async
。我还建议坚持异步方法命名的约定,并将方法名称更改为ProcessorBase.ProcessWebPagesAsync