通过调用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);
}
答案 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的值是什么。