C# 在c中向任务传递值参数#

C# 在c中向任务传递值参数#,c#,task,C#,Task,我在向任务传递long by值时遇到问题 我有一个ID列表,我在其中循环每个ID,分配给一个局部变量,然后作为参数传递给一个新任务。在循环并处理下一个ID之前,我不会等待任务完成。我保留了一个任务数组,但这与任务无关 loop long ID = list[index]; task[index] = Task.Factory.StartNew(() => doWork(ID)); end loop 如果列表包含例如100和200。我希望第一个任务调用100 然后第二个任务

我在向任务传递long by值时遇到问题

我有一个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%的证明,在运行了几次之后,我得到了一个名为200的方法

还尝试了以下方法

while (true)
{
    if (one.Status == TaskStatus.Running | one.IsCompleted == true)
    break;
}
但还是有200人参加了展览

您有什么想法可以保证在不等待任务完成的情况下传递给任务的值

有什么帮助/建议吗 艾德

您有什么想法可以保证在不等待任务完成的情况下传递给任务的值

当然-只需创建一个单独的变量,它不会在其他任何地方修改。您可以使用新的作用域来明确这一点:

long num = 100;
Task one;
{
    // Nothing can change copyOfNum!
    long copyOfNum = num;
    one = Task.Factory.StartNew(() => doWork(copyOfNum));
}

您不能将C#编译器更改为捕获“创建委托时变量的值”,而不是捕获变量,但您可以确保变量在创建委托后不会更改,从而完成相同的任务。

让我开心…:)