c# - winform 中的线程问题

标签 c# winforms multithreading

我需要同时计算文本框中元素的总和和元素的数量。所以我决定创建两个线程——一个用于数字的长度,一个用于元素的总和。但是当我只启动一个线程时 - 它工作正常。但是当我启动第二个线程时 - 表单开始工作缓慢或根本停止工作。 我创建了两个线程

thrd = new Thread(GetLength);
thrd.Start();
thrd1 = new Thread(SetSum);
thrd1.Start();

这些是线程的函数,用于计算文本框中数字的长度和计算其元素的总和。

private void SetSum()
{
    while (true)
    {
       if (this.label3.InvokeRequired)
           this.Invoke(new Action(() => label3.Text = this.GetSum().ToString()));
    }
}

private int GetSum()
{
    string n = textBox1.Text;
    int sum = 0;
    for (int i = 0; i < n.Length; i++)
     {
            try
            {
                sum += int.Parse(n[i].ToString());
            }
            catch (FormatException) { };
        }
        return sum;
     }

private void GetLength()
{
    while (true)
     {
            if (this.label2.InvokeRequired)
                this.Invoke(new Action(() => label2.Text = " |  Length = " + textBox1.Text.Length.ToString()));
     }
}

问题出在哪里?同步?

我找到了一个解决方案 - 我在 GetLength 方法的 while 循环中添加 Thread.Sleep(1)

最佳答案

这里有几个问题。

  1. 手头的任务对于一个(完整的)线程来说太小了。创建线程的成本很高。
  2. 通过调用主操作,所有工作都在主线程上完成。毕竟您的解决方案不是多线程的。
  3. 计数作为求和的副产品很容易完成(反之亦然),因此 2 个线程/任务是多余的。
  4. while(true) ... 循环会拖慢你的进程,白白浪费太多 CPU 时间

这里的简单答案是不使用任何线程,只是在 textBox1.TextChanged 中运行一些逻辑。

关于c# - winform 中的线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12464852/

相关文章:

c# - 谷歌表 API V4 : Unable to fetch cell note in Google Sheet

c# - Bin/Debug 和 Bin/Release 的区别

c# - HTML 敏捷包

c# - $(this) 在 C# 中等效

java - 如何从线程分配变量

Python gevent pool.join() 永远等待

c# - 在方法被调用时调用方法

c# - 如何使用 closedxml 将多个数据表添加到一个工作表?

c# - 为什么win32异常没有被c#异常处理机制捕获

Java Thread - 制作时钟和自己的时钟