我正在运行以下代码来启动我的线程,但它们没有按预期启动。出于某种原因,一些线程以相同的对象开始(有些甚至没有开始)。如果我尝试调试,它们会启动得很好(我单击 F10 单步执行代码增加了额外的延迟)。
这些是我的表单应用程序中的功能:
private void startWorkerThreads()
{
int numThreads = config.getAllItems().Count;
int i = 0;
foreach (ConfigurationItem tmpItem in config.getAllItems())
{
i++;
var t = new Thread(() => WorkerThread(tmpItem, i));
t.Start();
//return t;
}
}
private void WorkerThread(ConfigurationItem cfgItem, int mul)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(10*mul);
}
this.Invoke((ThreadStart)delegate()
{
this.textBox1.Text += "Thread " + cfgItem.name + " Complete!\r\n";
this.textBox1.SelectionStart = textBox1.Text.Length;
this.textBox1.ScrollToCaret();
});
}
谁能帮帮我?
最佳答案
Starting线程并没有真正启动线程。相反,它安排它执行。 IE。在某些时候,它会按计划运行。调度线程是一个复杂的主题,也是操作系统的一个实现细节,因此您的代码不应期望某个调度。
您还在 lambda 中捕获变量。请看this post (有一个关于捕获变量的部分)与这样做相关的问题。
关于c# - 线程启动期间的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2468646/