C# Timer 检查多线程是不是完成失败

Posted

技术标签:

【中文标题】C# Timer 检查多线程是不是完成失败【英文标题】:C# Timer to check if multithreading is finished failsC# Timer 检查多线程是否完成失败 【发布时间】:2019-02-16 10:14:33 【问题描述】:

我使用计时器来检查多线程是否已完成计算。 我有一个用于计算的元素列表和一个添加每个计算元素的列表视图。所以多线程的结果应该是listview元素的数量等于我列表的元素数量。多线程进行计算。

所以我使用了一个计时器,它每 10 秒检查一次列表视图元素的数量是否等于列表元素的数量,如果是,它将发出警报。

这也部分有效,但问题是我收到大约 15 个警报,而不仅仅是一个警报。我也尝试使用这样的块变量:

if(!block)

   Alert();
   block = true;

但我仍然收到大约 15 个警报。 重要的是,定时器不是(或应该)不是多线程方法的一部分,它将在多线程启动后第一次调用,而不是在多线程方法中。

【问题讨论】:

看看 async/await 我感觉您的问题出在细节上。如果您发布更多代码可能会有所帮助。 如果您能提供minimal reproducible example,那就太好了。 【参考方案1】:

如果您没有将计时器用于向用户显示所用时间等目的,请执行此操作。

    class Program
    
        static List<byte> bytes = new List<byte>();

        static int maxElements = 400_000;

        static Random random = new Random();

        static int portionSize;

        static void Main(string[] args)
        
            GenerateBytes();

            portionSize = maxElements / 4;

            ParallelLoopResult result = Parallel.For(0, 4, n =>
             
                 int portion = n * portionSize;
                 for (int i = portion; i < portion + portionSize; i++)
                 
                     bytes[i] = (byte)(bytes[i] * 2);
                 
             );

            Console.WriteLine();
        

        static void GenerateBytes()
        
            for (int i = 0; i < maxElements; i++)
            
                bytes.Add((byte)random.Next(0, 11));
            
        

在我的机器上计算 400,000 个元素非常快,因为我有 4 个内核。希望这会有所帮助!

【讨论】:

以上是关于C# Timer 检查多线程是不是完成失败的主要内容,如果未能解决你的问题,请参考以下文章

c#中Timer是单线程还是多线程

定期检查是不是所有线程都已完成

C#中定时器执行定时器触发任务是单线程还是多线程?

关于C#中的timer控件!

如何在 C# 控制台应用程序的多线程中同时实现 FileSystemWatcher 和 Timer?

c# 多线程运行时出现主界面卡死现象如何解决?