我在将 long 按值传递给任务时遇到问题。
我有一个 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% 的证明,经过几次运行后,我得到了 Method Called with 200
还尝试了以下方法
while (true)
{
if (one.Status == TaskStatus.Running | one.IsCompleted == true)
break;
}
但再次显示 200。
有什么想法可以保证传递给任务的值而不等待任务完成吗?