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 に結果が渡されます。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 に答える