将值参数传递给c#中的Task
我有一个问题,将long by值传递给Task。
我有一个ID列表,我遍历每个ID,分配给一个局部变量,然后作为参数传递给一个新的任务。 在循环并处理下一个ID之前,我不等待任务完成。 我保留了一系列任务,但这无关紧要。
loop long ID = list[index]; task[index] = Task.Factory.StartNew(() => doWork(ID)); end loop
如果列表包含例如100和200.我希望第一个任务调用100,然后第二个任务调用200.但它没有,doWork接收200两个任务,因此复制值时出现问题。
我可以用一些简单的控制台代码演示
class Program { static void Main(string[] args) { long num = 100; Task one = Task.Factory.StartNew(() => doWork(num)); num = 200; Console.ReadKey(); } public static void doWork(long val) { Console.WriteLine("Method called with {0}", val); } }
以上代码将始终显示
用200调用的方法
我修改了代码以等待任务状态从WaitingToRun切换
static void Main(string[] args) { long num = 100; Task one = Task.Factory.StartNew(() => doWork(num)); while(one.Status == TaskStatus.WaitingToRun) {} num = 200; Console.ReadKey(); }
这样可以改善事情,但不是100%certificate,经过几次运行后,我得到了200调用方法
还尝试了以下内容
while (true) { if (one.Status == TaskStatus.Running | one.IsCompleted == true) break; }
但再次显示200。
任何想法如何保证传递给任务的价值而不等待任务完成?
任何帮助/建议赞赏Ade
任何想法如何保证传递给任务的价值而不等待任务完成?
当然 – 只需创建一个单独的变量,在其他任何地方都不会修改。 您可以使用新范围来明确:
long num = 100; Task one; { // Nothing can change copyOfNum! long copyOfNum = num; one = Task.Factory.StartNew(() => doWork(copyOfNum)); }
您无法更改C#编译器以捕获“创建委托时变量的值”而不是捕获变量,但您可以确保变量之后不会更改,从而完成相同的操作。