在下面的函数中,始终将相同的user
对象传递给DoRestCall
方法
(我确实登录了DoRestCall
方法,它在user
对象中有相同的第一个数据)
我是否需要使用Parallel.ForEach而不是Threadpool
private void CreateUser(DataServiceCollection<User> epUsers)
{
foreach (User user in epUsers)
{
try
{
ThreadPool.QueueUserWorkItem(new WaitCallback(f =>
{
DoRestCall(string.Format("MESSAGE-TYPE=UserEnrollmentCreate&PAYLOAD={0}",
GenarateRequestUserData(user)), true);
}));
}
catch (Exception ex)
{
_logger.Error("Error in CreateUser " + ex.Message);
}
}
}
答案 0 :(得分:3)
问题是如何在lambda表达式或匿名方法中使用循环变量。 lambda表达式在执行lambda时查看循环变量的当前值。我相信这种行为在C#5.0中有所改变,但还没有尝试过。
您需要将当前用户存储在foreach循环内的变量中,并使用它而不是循环变量(同样,您的try / catch不会捕获WaitCallback
中的任何异常,请参阅修复下文):
foreach (User user in epUsers)
{
User currentUser = user;
ThreadPool.QueueUserWorkItem(new WaitCallback(f =>
{
try
{
DoRestCall(string.Format("MESSAGE-TYPE=UserEnrollmentCreate&PAYLOAD={0}",
GenarateRequestUserData(currentUser)), true);
}
catch (Exception ex)
{
_logger.Error("Error in CreateUser " + ex.Message);
}
}));
}