c# - 自定义线程中等待/异步的用法(和优点)

标签 c# .net multithreading asynchronous async-await

我正在编写一些代码来执行一些网络请求、操作答案并将结果返回给调用者。在我看来,这似乎是 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/

相关文章:

c# - 什么约定将 poco 属性自动映射到列?我怎样才能禁用该自动映射?

c# - 为什么可为空的 KeyValuePair<,> 没有键属性?

c++ - 多线程 - 在一个线程中增加整数并在另一个线程中减少

c - 如何使用clone()让父进程和子进程同时运行?

c# - 为什么我必须将自定义 ValueConverter 声明为 StaticResource 并绑定(bind)到资源,而不是绑定(bind)到它的类型?

c# - 在 wpf 数据网格中对所有行进行排序后触发哪个事件。

c# - 如何将十六进制字符串转换为 byte[]

c# - 如何使用 MVVM 模式在 Xamarin Forms 中为 ZXingScannerView 添加自定义叠加层?

android - 进度条加载消失