在 C# .NET 5 中同时并行执行任务

Posted

技术标签:

【中文标题】在 C# .NET 5 中同时并行执行任务【英文标题】:Execute tasks simultaneously in parallel in C# .NET 5 【发布时间】:2021-06-26 20:55:58 【问题描述】:

我正在尝试同时执行一系列任务,精确到纳秒。这可能吗?

似乎我添加的任务越多,不准确的范围就越大 - 这让我相信我做错了什么。

对此有最佳实践吗?

这是我的代码以及我得到的结果:

class Program

    static async Task Main(string[] args)
    
        int[] iterations = Enumerable.Range(1, 100).ToArray();
        Func<Task<DateTime>>[] delegates = new Func<Task<DateTime>>[iterations.Length];

        foreach (int i in iterations)
        
            async Task<DateTime> GetTime()
            
                await Task.Delay(1000);
                return DateTime.Now;
            

            delegates[Array.IndexOf(iterations, i)] = GetTime;
        

        Task<DateTime>[] tasks = delegates
            .AsParallel()
            .Select(async task => await task())
            .ToArray();

        await Task.WhenAll(tasks);

        DateTime[] dateTimes = tasks
            .Select(l => l.Result)
            .ToArray();

        foreach (DateTime dateTime in dateTimes)
            Console.WriteLine(dateTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"));
        Console.WriteLine("Range: " + (dateTimes.Max() - dateTimes.Min()).TotalMilliseconds);

        Console.ReadKey();
    

我 100 次迭代的平均结果:

范围:7.6709

【问题讨论】:

确保任务同时运行的实际用例是什么,精确到纳秒?你这样做是为了达到什么目的? 收集时间敏感数据。 收集什么时间敏感数据?再说一遍:你想解决什么实际问题? 它们是非常必要的。 help page for Stack Overflow says“您应该只根据您面临的实际问题提出实际的、可回答的问题”。目前尚不清楚这其中的哪一部分是实用的。它还可以指导答案,因为您正在做一些非常不寻常的事情并且不清楚原因。 如果你想做这样的事情,你需要在硬件层面做,当然不是在垃圾收集环境中。在之前的生命周期中,我们在一个控制系统中做到了这一点,该系统使用两个共享时序的隔离处理器和一个受控访问的处理器间总线——所有这些都是用 C 和 C++ 编程的。即便如此,它也是毫秒级的。 【参考方案1】:

我正在尝试同时执行一系列任务,精确到纳秒。这可能吗?

没有。这在任何使用抢占式调度的操作系统(例如 Windows 或 Linux)上都是不可能的。

【讨论】:

感谢您的澄清。

以上是关于在 C# .NET 5 中同时并行执行任务的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 并行任务中为多个服务调用创建并行任务

C# 并行开发总结

在 ADO.Net C# 中执行并行数据库访问

PowerShell 并行执行任务

同步 ,异步,并发/并行,串行

Quartz定时任务的并行与串行