0

我一直在寻找这个,但我不知道该怎么做。

我在应用程序中有一些威胁(任务)。

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

我认为,任务不会有用,程序将等待每个任务完成才能继续。

4

3 回答 3

2

看看 Task.ContinueWith()

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

当每个任务完成时,它会将结果传递给 ContinueWith,然后它可以什么都不做,记录或调用你想要的方法。

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

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

于 2012-12-02T16:52:01.950 回答
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();
    }
});
于 2012-12-02T17:10:00.770 回答
0

除了 LB 答案中给出的变体之外,我还将添加一个新变体:

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.

于 2012-12-02T18:00:37.750 回答