这可能是一个硬件问题,因为我并不完全确定如何实现后台工作者,但问题是:我有3个后台工作程序运行不同的线程。我已经编写了那些线程在开始和结束时显示的内容,并且我得到了一些非常奇怪的结果。
在一些执行中,所有3个线程都将启动,但只有1个线程将结束(我已经等了很多分钟才能看到程序执行速度是否非常慢,并在代码中加入了 - 它'没有慢跑,后台工作人员就死了#34;)。其他执行我得到2个线程来完成。其他时候我只有2个线程开始,并且两个结束等等。
我没有在运行之间更改代码(在下面输入),我只是停止程序并重新启动它。因此,我怀疑它可能是硬件问题(CPU可能?)。不幸的是,我现在没有另外一台PC来测试这个程序,而我正在使用的PC就是......远远不是最好的#34;
所以,我的问题:是否会出现导致后台工作者(以及正在处理的线程)的硬件问题导致死亡/根本无法启动?或者它绝对必须是代码中的东西吗?
(以下显然不是我的代码。这是一个更简单的版本来说明问题)代码:
public partial class Form1 : Form
{
BackgroundWorker[] workers = new BackgroundWorker[3];
Stopwatch timeKeeper = new Stopwatch();
string text = "";
public Form1()
{
timeKeeper.Start();
InitializeComponent();
for (int i = 0; i < 3; i++)
{
workers[i] = new BackgroundWorker();
workers[i].DoWork += new System.ComponentModel.DoWorkEventHandler(this.BWWorker_DoWork);
workers[i].RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.BWWorker_WorkDone);
workers[i].RunWorkerAsync(i);
}
}
private void BWWorker_WorkDone(object sender, RunWorkerCompletedEventArgs e)
{
this.textBox1.Text = text;
}
private void BWWorker_DoWork(object sender, DoWorkEventArgs e)
{
switch (e.Argument.ToString())
{
case "0":
startThread1();
break;
case "1":
startThread2();
break;
case "2":
startThread3();
break;
}
}
void startThread1()
{
text += Environment.NewLine + "Starting thread 1" + Environment.NewLine + "at " + timeKeeper.Elapsed.ToString();
this.textBox1.Text = text;
for (int i = 0; i < 25000; i++)
{
}
text += Environment.NewLine + "Ending thread 1" + Environment.NewLine + "at " + timeKeeper.Elapsed.ToString();
}
void startThread2()
{
text += Environment.NewLine + "Starting thread 2" + Environment.NewLine + "at " + timeKeeper.Elapsed.ToString();
this.textBox1.Text = text;
for (int i = 0; i < 10000; i++)
{
}
text += Environment.NewLine + "Ending thread 2" + Environment.NewLine + "at " + timeKeeper.Elapsed.ToString();
}
void startThread3()
{
text += Environment.NewLine + "Starting thread 3" + Environment.NewLine + "at " + timeKeeper.Elapsed.ToString();
this.textBox1.Text = text;
for (int i = 0; i < 75000; i++)
{
}
text += Environment.NewLine + "Ending thread 3" + Environment.NewLine + "at " + timeKeeper.Elapsed.ToString();
}
}
没有代码更改的3次背对背运行的结果如下:(第3张照片根据需要全部运行3次。前2次运行/完成一些线程,但不是全部(同样,我和#39;让程序运行几分钟,所以我知道它不仅运行缓慢)......?)
答案 0 :(得分:3)
所以,我的问题是:是否会出现导致后台工作者(以及它正在处理的线程)的硬件问题导致死亡/无法启动?或者它绝对必须是代码中的东西?
这非常非常不可能。
我怀疑真正的问题是你要从多个theads更新text
。像这样连接字符串不是一个线程安全的操作,并且可以预期线程几乎同时完成。即使循环具有不同的迭代次数,线程调度中的微小波动也可能导致它们相互踩踏。特别是,行
text += Environment.NewLine + "Ending thread 1" + Environment.NewLine + "at " + timeKeeper.Elapsed.ToString();
可以运行
尝试使用lock
语句来更改线程共享的资源。