C# 线程池参数

C# 线程池参数,c#,.net,multithreading,threadpool,C#,.net,Multithreading,Threadpool,我正在测试一个简单的线程池解决方案,然后才将其应用到我的应用程序中,但我看到的结果对我来说没有意义。我有一个简单的表单,上面有一个按钮。此按钮启动以下循环: private void button1_Click(object sender, EventArgs e) { MyTestThread oTask = new MyTestThread (); MyThreadInfo oTaskParameters = new MyThreadInfo(); for (int

我正在测试一个简单的线程池解决方案,然后才将其应用到我的应用程序中,但我看到的结果对我来说没有意义。我有一个简单的表单,上面有一个按钮。此按钮启动以下循环:

private void button1_Click(object sender, EventArgs e)
{
    MyTestThread oTask = new MyTestThread ();
    MyThreadInfo oTaskParameters = new MyThreadInfo();
    for (int i = 1; i <= 5; i++)
    {
        objTaskParameters.MyGuid = Guid.NewGuid();
        objTaskParameters.MyNumber = i;
        ThreadPool.QueueUserWorkItem(new WaitCallback(objTask.ProcessDataForNTime), objTaskParameters);
    }
    Console.WriteLine("All threads have been queued for processing...");
}
我希望这个结果在我的控制台/输出/调试日志中显示类似的内容。当我逐步浏览应用程序时,我确实看到了以下内容:

thread 1 started...
thread 2 started...
thread 3 started...
thread 4 started...
thread 5 started...
All threads have been queued for processing...
thread 1 completed...
thread 2 completed...
thread 3 completed...
thread 4 completed...
thread 5 completed...
但是,如果我以全速运行应用程序,而不单步执行代码或断点,它会输出以下内容:

All threads have been queued for processing...
thread 5 started...
thread 5 started...
thread 5 started...
thread 5 started...
thread 5 started...
thread 5 completed...
thread 5 completed...
thread 5 completed...
thread 5 completed...
thread 5 completed...
在代码中单步执行是什么让它工作的?我确实注意到,向循环中添加Thread.Sleep(1000)(1秒)确实会迫使应用程序正确标记线程,但我正在尝试开发一个快速多线程应用程序,为每个线程添加1秒延迟的想法令人沮丧

有人能告诉我为什么我会看到这种行为吗

谢谢


Sam

您需要为每个新线程传递一个全新的对象。目前,它们都在主线程中获得对同一对象的引用,即
oTaskParameters

在将
MyNumber
设置为
MyThreadInfo
构造函数上的参数后,尝试此操作:

for (int i = 1; i <= 5; i++)
{
    MyThreadInfo oTaskParameters = new MyThreadInfo(i);
    objTaskParameters.MyGuid = Guid.NewGuid();
    ThreadPool.QueueUserWorkItem(new WaitCallback(objTask.ProcessDataForNTime), objTaskParameters);
}

MyThreadInfo(int i) : MyNumber(i)
{
  // rest of construction logic
}

for(int i=1;i您需要为每个新线程传递一个全新的对象。目前,它们都在主线程中获得对同一对象的引用,即
oTaskParameters

在将
MyNumber
设置为
MyThreadInfo
构造函数上的参数后,尝试此操作:

for (int i = 1; i <= 5; i++)
{
    MyThreadInfo oTaskParameters = new MyThreadInfo(i);
    objTaskParameters.MyGuid = Guid.NewGuid();
    ThreadPool.QueueUserWorkItem(new WaitCallback(objTask.ProcessDataForNTime), objTaskParameters);
}

MyThreadInfo(int i) : MyNumber(i)
{
  // rest of construction logic
}

for(int i=1;i Perfect。我不太担心顺序,只是能够在线程发生时识别它们。感谢您的帮助!完美。我不太担心顺序,只是能够在线程发生时识别它们。谢谢您的帮助!