我有一台 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/