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