c# - 使用 async 和 await 的最佳性能

标签 c# multithreading asynchronous async-await

我有一台 1 核机器,我想使用 async 和 await 来提高我的代码性能。
代码有两个主要部分。第一个IO操作。 (从 azure 服务总线队列中读取多个 sessionId),第二个,处理数据 - CPU 很重。
我将 DequeueAsync 方法包装在一个返回任务的异步方法中:

private async Task<SomeReturnValue> AcceptFromQueueAsync(){
  try{ 
       SomeReturnValue result = await DequeueAsync.configureAwait(false);
       return SomeReturnValue;  
  }
  catch{
   //logging and stuff
  }

CPU 重的方法是同步:DoSyncWork()
由于第二部分 CPU 很重,我不想使用并行性(实际上不能......)
CPU 部分只有在 IO 部分完成后才能启动。
鉴于以上是以下实现与 1 个 cpu 机器一起使用的方法吗?
private void AcceptAndProcessWrapper(){
    //Count is some cosnt defined outside the method
    _acceptTasks = new List<Task<SomeReturnValue>>();
     for (var i = 0; i < Count; i++)
     {
                    _acceptTasks.Add(AcceptFromQueueAsync());
      }
      //The use of list is for convince in processing  
      Task.WaitAll(_acceptTasks.ToArray());
      //The CPU part 
       Task.Run(DoSyncWork).Wait();
 }

我知道我不能将 Task.Run() 用于同步部分,但我想允许在多个核心上实现功能(通过使用 Task.Run() 启动多个任务并将它们保存在一个数组中)
请问上面的执行。 (多次调用返回任务的异步方法)提高性能?或者我应该为每个异步调用启动一个新任务,例如 Task.Run(AcceptFromQueueAsync)?

最佳答案

您拥有的代码确实会并行执行异步出队。它将立即启动所有异步任务,然后等到它们全部完成后再继续。

添加一个额外的电话到 Task.Run不会有帮助的。在另一个线程中启动异步任务只是增加了额外的开销而没有任何附加值。 Task.Run应该用于在另一个线程中运行 CPU 密集型工作,而不是在另一个线程中运行异步工作。

关于c# - 使用 async 和 await 的最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936608/

相关文章:

java - 循环方法中的线程

c++ - 指针在 OpenMP 并行部分中是私有(private)的吗?

c++ - 多线程时QFileDialog绘画问题

javascript - Node.js 中的回调未异步执行

c# - 为什么这个异步 lambda 函数调用不能在 C# 中编译?

c# - 已执行 SQL 更新命令但未更改数据库

c# - 带有 WPF 菜单控件的下拉列表

c# - 使用c#在一个程序中访问两个表

c# - 如何从另一个类中删除 ListView 项

c# - 使用(而非滥用)ContinueWith