c#并发IO请求基础知识

问题描述 投票:1回答:1

我在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

因此所有操作都已完成。

这是真的?我应该重构这段代码吗?

c# multithreading concurrency
1个回答
0
投票

我想知道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

© www.soinside.com 2019 - 2024. All rights reserved.