C# 在c中向任务传递值参数#
我在向任务传递long by值时遇到问题 我有一个ID列表,我在其中循环每个ID,分配给一个局部变量,然后作为参数传递给一个新任务。在循环并处理下一个ID之前,我不会等待任务完成。我保留了一个任务数组,但这与任务无关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 然后第二个任务
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#编译器更改为捕获“创建委托时变量的值”,而不是捕获变量,但您可以确保变量在创建委托后不会更改,从而完成相同的任务。让我开心…:)