我正在编写一些代码来执行一些网络请求、操作答案并将结果返回给调用者。在我看来,这似乎是 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 Bound 操作的优点是可以避免分配专用 Thread
的成本这主要是阻塞等待从网络硬件返回的响应。当你 await
,当响应返回时,工作正在被处理并通过 IOCP 池回调,您可以设置您希望方法的其余部分(继续)运行的位置(线程池线程、UI 线程等)
我认为运行 ProcessorBase.ProcessWebPages
没有什么特别的好处在专用线程上。如果可以的话,您应该避免为您的工作分配这样的线程并使用纯 async
反而。我还建议坚持异步方法命名的约定,并将方法名称更改为 ProcessorBase.ProcessWebPagesAsync
关于c# - 自定义线程中等待/异步的用法(和优点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23863118/