Roc*_*lan 2 c# parallel-processing httpclient task dapper
使用 Parallel.ForEach 时,将任何 DB 或 Api 调用转换为异步方法是否会提高性能?
一些背景知识,我目前有一个控制台应用程序,它按顺序循环访问一堆文件,并为每个文件调用一个 API 并进行一些数据库调用。主要逻辑如下:
foreach (file in files)
{
    ReadTheFileAndComputeAFewThings(file);
    CallAWebService(file);
    MakeAFewDbCalls(file);
}
目前,所有数据库和 Web 服务调用都是同步的。
Parallel.ForEach正如您所期望的那样,更改要使用的循环给我带来了巨大的性能提升。
我想知道是否将调用保留Parallel.ForEach在那里,并在循环内将所有 Web 服务调用更改为异步(例如,HttpClient.SendAsync)并将 DB 调用更改为异步(使用 Dapper,db.ExecuteAsync()) - 这是否会通过允许它来提高应用程序的性能重用线程?或者它实际上什么都不做,因为Parallel.ForEach无论如何都会处理线程分配?
答案是不。异步提供的是可扩展性,而不是性能。它允许使用更少的线程完成相同的工作,因此使用更少的内存(每个阻塞的线程 = 1 MB的浪费内存)。
\n\n\n不过,请务必记住,异步性并不是针对单个操作的性能优化。采用同步操作并将其设为异步必然会降低该操作的性能,因为它仍然需要完成同步操作所做的所有事情,但现在有额外的约束和注意事项。
\n
需要注意的是,该Parallel.ForEachAPI 不能与异步委托一起使用body。使用async此 API是一个错误。当您想要并行化异步操作时,要使用的正确 API 是Parallel.ForEachAsync.NET 6 及更高版本中提供的 API。
| 归档时间: | 
 | 
| 查看次数: | 2975 次 | 
| 最近记录: |