c# - 线程启动期间的竞争条件?

标签 c# windows multithreading forms race-condition

我正在运行以下代码来启动我的线程,但它们没有按预期启动。出于某种原因,一些线程以相同的对象开始(有些甚至没有开始)。如果我尝试调试,它们会启动得很好(我单击 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/

相关文章:

c# - Http 上传,保存修改/写入日期?

windows - 获取 DLL 文件的 CLSID?

c# - 如何将多个 View 模型绑定(bind)到 MVVM wpf 中的单个 xaml 文件?

c# - 以编程方式登录网站的技术

c++ - 无法在 SQLite 的命令行上访问表

c++ - 为什么在所有 5 个线程都为多线程 C++ 餐饮哲学家之谜运行后,我只得到线程 # 0 的无限循环

c# - 在 C# 中,SerialPort 类的 DataReceived 事件处理程序是否在它自己的线程上执行?

c# - C# += 线程安全吗?

java - 需要一个双向 Map,它允许重复值,并返回给定键的值列表

linux - 用于运行和测试 ssh 命令的 Unix 编辑器