我一直在寻找这个,我无法想象如何去做。
我在App中有一些威胁(任务)。
foreach (string targetMachine in targetMachines)
{
Task<int> task = Task.Run(() => Magic(targetMachine));
}
我为数组中的每个对象创建了一个任务。 该任务返回一个值。 我想处理价值观并根据它们采取行动。例如,如果任务返回0没有做任何事情,如果返回1写一个日志,如果返回2则运行一个进程。
我该怎么做到这一点? 如果我在foreach中处理返回值:
foreach (string targetMachine in targetMachines)
{
Task<int> task = Task.Run(() => Magic(targetMachine));
Task.Waitforexit()
if (task.result == 2)
{
do something
}
}
我认为,任务不会有用,并且程序将等待每项任务完成以继续。
答案 0 :(得分:2)
查看Task.ContinueWith()
http://msdn.microsoft.com/en-us/library/dd321405.aspx
当每个任务完成后,它会将结果传递给ContinueWith,然后可以不执行任何操作,记录或调用您想要的方法。
此外,您可以运行foreach .AsParallel()并完全删除任务。
答案 1 :(得分:2)
可能是这样的:
foreach (string targetMachine in targetMachines)
{
Task.Run(() =>
{
var result = Magic(targetMachine);
if (result == 2)
{
DoSomething();
}
});
}
或(使用async/await)
foreach (string targetMachine in targetMachines)
{
var result = await Task.Run(() => Magic(targetMachine));
if (result == 2)
{
DoSomething();
}
}
或(使用ContinueWith)
foreach (string targetMachine in targetMachines)
{
Task<int>.Run(()=>Magic(targetMachine))
.ContinueWith(t =>
{
if (t.Result == 2)
{
DoSomething();
}
});
}
如果您想等待完成所有任务
Parallel.ForEach(targetMachines, targetMachine =>
{
var result = Magic(targetMachine);
if (result == 2)
{
DoSomething();
}
});
答案 2 :(得分:0)
除了L.B.的回答中提供的变体之外,我还将添加一个新的变体:
var tasks = targetMachines.Select(x => Magic(x));
Task.WaitAll(tasks); //fork-join
如果你使用异步,你可以写:
var tasks = targetMachines.Select(x => Magic(x));
await Task.WhenAll(tasks); //fork-join
而不是
var tasks = targetMachines.Select(x => Magic(x));
你总是可以写:
var tasks = targetMachines.Select(x =>
{
var result = Magic(x);
if (result == 2) DoSomething();
});
让您免于使用ContinueWith
。