c#并发IO请求基础知识

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#并发IO请求基础知识相关的知识,希望对你有一定的参考价值。

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

以上是关于c#并发IO请求基础知识的主要内容,如果未能解决你的问题,请参考以下文章

golang代码片段(摘抄)

csharp C#代码片段 - 使类成为Singleton模式。 (C#4.0+)https://heiswayi.github.io/2016/simple-singleton-pattern-us

如何限制并发的 异步IO 请求数量?

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

多个请求是多线程吗

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段