我需要同时计算文本框中的元素总数和元素数量。所以我决定创建两个线程 - 一个用于数字的长度,一个用于元素的总和。但是,当我只启动一个线程时 - 它的工作正确。但是,当我开始第二个线程时 - 表单开始工作缓慢或停止工作。 我创建了两个线程
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)
答案 0 :(得分:2)
这里有几个问题。
while(true) ...
循环将拖动您的进程,消耗太多的CPU时间这里的简单答案是不使用任何线程,只需在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()));
}
}