在c#中同时运行同一方法的多个实例而不丢失数据?
我真的不太理解任务和线程。 我想在不同的线程/任务中多次运行的的三层嵌套在c#中同时运行同一方法的多个实例而不丢失数据?,c#,task-parallel-library,task,taskfactory,C#,Task Parallel Library,Task,Taskfactory,我真的不太理解任务和线程。 我想在不同的线程/任务中多次运行的的三层嵌套中有一个方法,但是我传递给该方法的变量变得疯狂,让我用一些代码解释一下: 列表编号=新列表(); 对于(int a=0;a检查中的语句。b和c从不递增 然后,您会遇到一个问题,这可能是其他问题的原因 检查您的语句。b和c从不递增 然后,您会遇到一个问题,这可能是其他问题的原因 问题是,您使用的变量已经或将要在/lambda之外修改。您应该会收到警告,说“访问修改的闭包” 您可以先将循环变量放入局部变量,然后使用这些变量来
中有一个方法,但是我传递给该方法的变量变得疯狂,让我用一些代码解释一下:
列表编号=新列表();
对于(int a=0;a检查中的语句。b
和c
从不递增
然后,您会遇到一个问题,这可能是其他问题的原因
检查您的语句。b
和c
从不递增
然后,您会遇到一个问题,这可能是其他问题的原因
问题是,您使用的变量已经或将要在/lambda之外修改。您应该会收到警告,说“访问修改的闭包”
您可以先将循环变量放入局部变量,然后使用这些变量来修复它:
namespace ConsoleApplication9
{
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static void Main()
{
var numbers = new List<int>();
for(int a=0;a<=70;a++)
{
for(int b=0;b<=6;b++)
{
for(int c=0;c<=10;c++)
{
var unmodifiedA = a;
var unmodifiedB = b;
var unmodifiedC = c;
Task.Factory.StartNew(() => MyMethod(numbers, unmodifiedA, unmodifiedB, unmodifiedC));
}
}
}
}
private static void MyMethod(List<int> nums, int a, int b, int c)
{
//Really a lot of stuffs here
}
}
}
命名空间控制台应用程序9
{
使用System.Collections.Generic;
使用System.Threading.Tasks;
班级计划
{
静态void Main()
{
变量编号=新列表();
对于(int a=0;a而言,问题在于,您使用的变量已经或将在/lambda之外修改。您应该得到警告,称为“访问修改的闭包”
您可以先将循环变量放入局部变量,然后使用这些变量来修复它:
namespace ConsoleApplication9
{
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static void Main()
{
var numbers = new List<int>();
for(int a=0;a<=70;a++)
{
for(int b=0;b<=6;b++)
{
for(int c=0;c<=10;c++)
{
var unmodifiedA = a;
var unmodifiedB = b;
var unmodifiedC = c;
Task.Factory.StartNew(() => MyMethod(numbers, unmodifiedA, unmodifiedB, unmodifiedC));
}
}
}
}
private static void MyMethod(List<int> nums, int a, int b, int c)
{
//Really a lot of stuffs here
}
}
}
命名空间控制台应用程序9
{
使用System.Collections.Generic;
使用System.Threading.Tasks;
班级计划
{
静态void Main()
{
变量编号=新列表();
对于(int a=0;amyMethod
或myMethod
?您正在将int
传递给myMethod
的第一个参数。myMethod
将列表作为第一个参数。当您的代码没有真正意义时,很难提供帮助。我的错误,已编辑并更正“这是嵌套,myMethod确实做了很多事情”.Methods不应该做很多事情,但有一件事。这会导致您遇到的问题。可能重复myMethod
或myMethod
?您正在将int
传递给myMethod
的第一个参数。myMethod
将列表作为第一个参数。当您的代码为d时,很难提供帮助oesn真的没有意义。我的坏,编辑和更正“这是巢,我的方法真的做了很多事情”.Methods不应该做很多事情,但有一件事。这是您遇到的问题的原因。非常感谢,这是一个完美的解决方案!这在C#5.0中也适用吗?我的理解是,闭包和变量捕获方面会有突破性的变化。@ChrisDunaway这种变化只适用于foreach
。非常感谢,这是一个完美的解决方案!这是否也适用于C#5.0?我的理解是,关于闭包和变量捕获将有一个突破性的更改。@ChrisDunaway该更改仅适用于foreach
。