C# winforms中的线程问题

C# winforms中的线程问题,c#,winforms,multithreading,C#,Winforms,Multithreading,我需要同时计算文本框中的元素和元素数。所以我决定创建两个线程——一个用于数字的长度,另一个用于元素的总和。但是当我只启动一个线程时,它工作正常。但是,当我启动第二个线程时,表单开始缓慢工作或完全停止工作。 我创建了两个线程 thrd = new Thread(GetLength); thrd.Start(); thrd1 = new Thread(SetSum); thrd1.Start(); 这些是线程的函数,用于计算文本框中数字的长度和元素的总和 private void SetSum()

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

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()));
     }
}
private void SetSum()
{
while(true)
{
if(this.label3.invokererequired)
this.Invoke(新操作(()=>label3.Text=this.GetSum().ToString());
}
}
私有int GetSum()
{
字符串n=textBox1.Text;
整数和=0;
对于(int i=0;ilabel2.Text=“|Length=“+textBox1.Text.Length.ToString());
}
}
问题在哪里?同步


我找到了一个解决方案-我在GetLength方法的while循环中添加了
Thread.Sleep(1)
是的,问题实际上是同步:太多了


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

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


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

这里有几个问题

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

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

    这里有几个问题

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

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

    这部分代码是一个无限循环,没有任何线程。睡眠或任何其他等待。这将使CPU达到100%。您应该将此绑定到某个事件或任何其他将触发GetLength的活动

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

    这部分代码是一个无限循环,没有任何线程。睡眠或任何其他等待。这将使CPU达到100%。您应该将此绑定到某个事件或任何其他将触发GetLength的活动

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

    我在textbox中写,它计算它的长度-我不知道如何更改它。(和相同)我在textbox中写,它计算它的长度-我不知道如何更改它。(和相同)但是除了无限循环的线程之外,没有其他解决方案。或者它不会移动到任何其他具有表单的操作。是的,有:没有线程。如果目标是在文本框的内容更改时更新标签,则只需要TextChanged事件。在此上下文中,您的线程方法有太多错误需要修复。但除了无限循环线程之外,没有其他解决方案。或者它不会移动到任何其他具有表单的操作。是的,有:没有线程。如果目标是在文本框的内容更改时更新标签,则只需要TextChanged事件。在此上下文中,线程方法有太多错误需要修复。