foreach中的ThreadPool.QueueUserWorkItem使用相同的数据集

时间:2014-06-24 06:19:43

标签: c# multithreading threadpool parallel.foreach

在下面的函数中,始终将相同的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);
        }
    }
}

1 个答案:

答案 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);
        }
    }));
}