3
public class PerformMainTask()
{
    Task1();
    Task2();
    PerformLongTask();
    Task3();
    Task4();
}

ここで達成したいのは、PerformLongTask()別のスレッドに移動し、まだ実行中の場合でも Task3 と Task4 を続行することPerformLongTask()です。

PerformLongTask()C# 5.0 の場合、どのようにすればよいですか?

を使用する必要がありますasync/awaitか?

4

3 に答える 3

4

私が知っている最も簡単な解決策は次のとおりです。

Task1();
Task2();
var task3 = Task.Run(() => PerformLongTask());
Task4();
Task5();
task3.Wait(); //if task3 has not started yet it will be inlined here

シンプルで効率的。エラーを伝播する必要がある場合は、おそらく次を使用する必要がありますParallel.Invoke

Parallel.Invoke(
 () => { PerformLongTask(); },
 () => { Task4(); Task5(); }
);
于 2013-07-18T10:37:52.427 に答える
2

C# 5 を使用していて、すべての Task() メソッドが本当に a Task(または待機可能なもの) を返すと仮定すると、コードは次のようになります。

public async Task PerformMainTask()
{
    await Task1();
    await Task2();
    // Start long task
    var longTask = PerformLongTask();
    await Task3();
    await Task4();
    //wait for long task to finish
    await longTask;
}

ただし、長いタスクが単独で並行して実行されない場合は、次のようにして強制的に実行できますTask.Run

public async Task PerformMainTask()
{
    await Task1();
    await Task2();
    // Start long task
    var longTask = Task.Run(PerformLongTask);
    await Task3();
    await Task4();
    //wait for long task to finish
    await longTask;
}

あなたのタスクが実際にタスクでない場合は、最後のものを除いてすべての await を取り除くだけで、準備完了です。

于 2013-07-18T11:32:21.673 に答える