【问题标题】: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,那就太好了。

标签: c# multithreading timer


【解决方案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 个内核。希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    相关资源
    最近更新 更多