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线程正在完成所有工作。这里有几个问题
while(true).
循环会拖慢进程,白白浪费太多CPU时间这里的简单答案是不使用任何线程,只需在
textBox1.TextChanged
中运行一些逻辑即可 这里有几个问题
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事件。在此上下文中,线程方法有太多错误需要修复。