Ant*_*one 1 c# task task-parallel-library taskfactory
我真的不太了解任务和线程.我在嵌套的三个级别中有一个方法for,我希望在不同的线程/任务中多次运行,但是我传递给方法的变量变得疯狂,让我用一些代码解释一下:
List<int> numbers=new List<int>();
for(int a=0;a<=70;a++)
{
for(int b=0;b<=6;b++)
{
for(int c=0;b<=10;c++)
{
Task.Factory.StartNew(()=>MyMethod(numbers,a,b,c));
}
}
}
private static bool MyMethod(List<int> nums,int a,int b,int c)
{
//Really a lot of stuff here
}
Run Code Online (Sandbox Code Playgroud)
这是嵌套,myMethod确实做了很多事情,比如计算一些数字的阶乘,写入不同的文档和匹配响应与组合列表并调用其他小方法,它也有一些返回值(布尔值),但我此刻不要关心他们.问题是没有任务达到目的,就像每次嵌套调用它自己刷新的方法一样,删除以前的实例.它还会给出一个错误,"尝试除以0",其值超过由FORs分隔的值,例如a=71, b=7, c=11所有变量都为空(这就是除以零的原因).我真的不知道如何解决它.
问题是,您正在使用已经或将要在闭包/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
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3463 次 |
| 最近记录: |