C# foreach内部的ThreadPool.QueueUserWorkItem使用相同的数据集

C# foreach内部的ThreadPool.QueueUserWorkItem使用相同的数据集,c#,multithreading,threadpool,parallel.foreach,C#,Multithreading,Threadpool,Parallel.foreach,在下面的函数中,始终将相同的user对象传递给DoRestCall方法 (我确实登录了DoRestCall方法,并且它在user对象中具有相同的第一个数据) 我是否需要使用Parallel.ForEach而不是Threadpool private void CreateUser(DataServiceCollection<User> epUsers) { foreach (User user in epUsers) { try {

在下面的函数中,始终将相同的
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);
        }
    }
}
private void CreateUser(DataServiceCollection epUsers)
{
foreach(epUsers中的用户)
{
尝试
{
ThreadPool.QueueUserWorkItem(新的WaitCallback(f=>
{
DoRestCall(string.Format(“MESSAGE-TYPE=UserEnrollmentCreate&PAYLOAD={0}”),
GenarateRequestUserData(用户)),true);
}));
}
捕获(例外情况除外)
{
_logger.Error(“CreateUser中的错误”+ex.Message);
}
}
}

问题在于在lambda表达式或匿名方法中使用循环变量时如何处理。lambda表达式在执行lambda时查看循环变量的当前值。我相信这种行为在C#5.0中已经改变,但还没有尝试过

您需要将当前用户存储在foreach循环中的一个变量中,并使用该变量而不是循环变量(此外,您的try/catch不会捕获
WaitCallback
中的任何异常,请参阅下面的修复):


问题是在lambda表达式或匿名方法中使用循环变量时如何处理。lambda表达式在执行lambda时查看循环变量的当前值。我相信这种行为在C#5.0中已经改变,但还没有尝试过

您需要将当前用户存储在foreach循环中的一个变量中,并使用该变量而不是循环变量(此外,您的try/catch不会捕获
WaitCallback
中的任何异常,请参阅下面的修复):


问题是在lambda表达式或匿名方法中使用循环变量时如何处理。lambda表达式在执行lambda时查看循环变量的当前值。我相信这种行为在C#5.0中已经改变,但还没有尝试过

您需要将当前用户存储在foreach循环中的一个变量中,并使用该变量而不是循环变量(此外,您的try/catch不会捕获
WaitCallback
中的任何异常,请参阅下面的修复):


问题是在lambda表达式或匿名方法中使用循环变量时如何处理。lambda表达式在执行lambda时查看循环变量的当前值。我相信这种行为在C#5.0中已经改变,但还没有尝试过

您需要将当前用户存储在foreach循环中的一个变量中,并使用该变量而不是循环变量(此外,您的try/catch不会捕获
WaitCallback
中的任何异常,请参阅下面的修复):



foreach
在C#5.0中更改了,
for
没有更改,所以您在所有方面都是正确的。
foreach
在C#5.0中更改了,
for
没有更改,所以您在所有方面都是正确的。
foreach
在C#5.0中更改了,
for
没有更改,因此,您在所有方面都是完全正确的。
foreach
在C#5.0中被更改,
for
没有更改,因此您在所有方面都是完全正确的。如果您正在进行REST调用,为什么要使用
ThreadPool
进行I/O绑定工作?您使用的是哪个版本的.NET framework?我正在进行rest调用。有什么缺点吗?C#和.net4.0是的。分配一个线程池线程只是为了阻止等待REST调用返回,这是一种资源浪费。有其他选择吗?如果正在进行REST调用,为什么要使用
ThreadPool
进行I/O绑定工作?您使用的是哪个版本的.NET framework?我正在进行rest调用。有什么缺点吗?C#和.net4.0是的。分配一个线程池线程只是为了阻止等待REST调用返回,这是一种资源浪费。有其他选择吗?如果正在进行REST调用,为什么要使用
ThreadPool
进行I/O绑定工作?您使用的是哪个版本的.NET framework?我正在进行rest调用。有什么缺点吗?C#和.net4.0是的。分配一个线程池线程只是为了阻止等待REST调用返回,这是一种资源浪费。有其他选择吗?如果正在进行REST调用,为什么要使用
ThreadPool
进行I/O绑定工作?您使用的是哪个版本的.NET framework?我正在进行rest调用。有什么缺点吗?C#和.net4.0是的。您分配一个线程池线程只是为了阻止等待REST调用返回,这是一种资源浪费。有其他选择吗?
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);
        }
    }));
}