在winforms中遇到麻烦

时间:2012-09-17 18:06:50

标签: 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)

3 个答案:

答案 0 :(得分:2)

这里有几个问题。

  1. 手头的任务对于(完整)线程来说太小了。线程的创建成本很高。
  2. 通过调用主操作,所有工作都在主线程上完成。毕竟,您的解决方案不是多线程的。
  3. 计数很容易作为Summing的副产品(反之亦然),因此2个线程/任务是过度的。
  4. while(true) ...循环将拖动您的进程,消耗太多的CPU时间
  5. 这里的简单答案是不使用任何线程,只需在textBox1.TextChanged中运行一些逻辑。

答案 1 :(得分:1)

是的,问题实际上是同步:它太多了。

您正在生成只执行Invoke s的线程,这意味着UI线程正在完成所有工作。

答案 2 :(得分:1)

这部分代码是无限循环,没有任何Thread.Sleep或任何其他Wait。这将使CPU达到100%。您应该将此绑定到某个事件或任何其他会触发GetLength

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