我在c#和相关的async-await模式中遇到并发问题。
我面临性能问题,因为我需要使用多个数据库提供程序。 _schedulesProvider
拥有各种供应商。我真的不想改变任何东西,但我的想法是同时执行那些昂贵的I / O操作。我知道在这里使用await async是理想的,以便在等待I / O操作完成时不阻塞调用线程,但此刻我并不是真的很烦。
考虑以下代码:
//queuing all the expensive code in tasks
List<Task> scheduleProviderTasks = _schedulesProvider.Select(scheduleProvider =>
{
return
Task.Run(() =>
{
//expensive I/O operation
var schedules = scheduleProvider.Get();
if (!schedules.Schedules.Any())
{
return;
}
//do some stuff with the result
schedules.Schedules.ForEach(x =>
{
DoSomething(x);
});
});
}).ToList();
//run all tasks
scheduleProviderTasks.ForEach(x=>x.RunSynchronously());
我期待的是:
由于昂贵的操作并行运行,此操作的成本现在应该低得多。
当前的线程被阻止,直到qazxsw poi
因此所有操作都已完成。
这是真的?我应该重构这段代码吗?
我想知道Task.WaitAll是否可能对您的情况有所帮助。
以下是并行执行4 x 1秒任务的示例,其中总时间为2.6706808秒。
scheduleProviderTasks.ForEach(x=>x.RunSynchronously());
输出的地方是:
与B @ 00:00:01.0638455完成
用A @ 00:00:01.0673050完成
用D @ 00:00:02.5961501完成
用C @ 00:00:02.5962068完成
完成@ 00:00:02.6706808