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

时间:2016-08-09 21:41:47

标签: c# concurrency

通过调用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);
}

1 个答案:

答案 0 :(得分:2)

  

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

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

// 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的值是什么。

相关问题