传递给在紧循环中生成的线程的参数

本文关键字:线程 参数 循环 | 更新日期: 2023-09-27 18:01:29

有一个紧密的循环,队列通过调用QueueUserWorkItem来工作于不同的线程。

我想知道是否每次循环执行都可能改变作为参数传递给前一个池线程的内容。

List<object> list = new List<object>();
for (int i = 0; i < list.Count; i++)
{
    object param = list[i];
    ThreadPool.QueueUserWorkItem(x => { MethodWithParameter(x); }, param);
}

传递给在紧循环中生成的线程的参数

我想知道是否每个循环执行可能会改变传递给前一个池线程的参数

不,将任务排队到池中的那部分代码是同步的

// here you are assigning the value that 
// will be used as the state for the task when it is run
object param = list[i];
ThreadPool.QueueUserWorkItem(x => { MethodWithParameter(x); }, param);

因此,无论param在调用方法时的值是多少,QueueUserWorkItem将在任务开始时作为x传递

你这样做可能会遇到麻烦:

object param = null;
for (int i = 0; i < list.Count; i++)
{
    //even though you are assigning a value to param here
    //there is no telling when the task will actually execute
    param = list[i];
    ThreadPool.QueueUserWorkItem(x => { MethodWithParameter(param); }, null);
}

因为当任务实际执行时,无法告诉param的值是什么