在Foreach c#中处理任务的结果

时间:2012-12-02 16:44:36

标签: c# .net multithreading

我一直在寻找这个,我无法想象如何去做。

我在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
        }
    }

我认为,任务不会有用,并且程序将等待每项任务完成以继续。

3 个答案:

答案 0 :(得分:2)

查看Task.ContinueWith()

http://msdn.microsoft.com/en-us/library/dd321405.aspx

当每个任务完成后,它会将结果传递给ContinueWith,然后可以不执行任何操作,记录或调用您想要的方法。

此外,您可以运行foreach .AsParallel()并完全删除任务。

http://msdn.microsoft.com/en-us/library/dd413602.aspx

答案 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