2

Task、Task1、および Task2 があります。Task1 と Task2 は互いに独立していますが、どちらも Task の結果に依存します。私はそれをこのように機能させることができます:

static async Task Test1()
{
    var task = Task.Delay(1000);

    var task1 = task.ContinueWith(_ => 
    {
        Console.WriteLine("Task1, thread: {0}", Thread.CurrentThread.ManagedThreadId);
    });

    var task2 = task.ContinueWith(_ =>
    {
        Console.WriteLine("Task2, thread: {0}", Thread.CurrentThread.ManagedThreadId);
    });

    await Task.WhenAll(task1, task2);
}

または、代わりに、次のようにします。

static async Task Test2()
{
    var task = Task.Delay(1000);
    await task;

    var task1 = Task.Run(() =>
    {
        Console.WriteLine("Task1, thread: {0}", Thread.CurrentThread.ManagedThreadId);
    });

    var task2 = Task.Run(() =>
    {
        Console.WriteLine("Task2, thread: {0}", Thread.CurrentThread.ManagedThreadId);
    });

    await Task.WhenAll(task1, task2);
}

どちらの方法を優先する必要がありますか? どちらも同じように効率的ですか?これを構成するより良い方法はありますか?

4

2 に答える 2

2

asyncこれを構成するより良い方法は、フォローアップ用に別のメソッドを作成することだと思いますTask。何かのようなもの:

private static async Task Task1(Task task)
{
    await task;
    Console.WriteLine("Task1, thread: {0}", Thread.CurrentThread.ManagedThreadId);
}

private static async Task Task2(Task task)
{
    await task;
    Console.WriteLine("Task2, thread: {0}", Thread.CurrentThread.ManagedThreadId);
}

private static async Task Test1()
{
    var task = Task.Delay(1000);

    var task1 = Task1(task);
    var task2 = Task2(task);

    await Task.WhenAll(task1, task2);
}

これは、同期コンテキスト (存在する場合) に関してコードとは異なる動作をしますが、await task.ConfigureAwait(false).

于 2013-09-02T17:00:07.910 に答える
1

これは実際には答えではなく、別の選択肢です

var task = Task.Delay(1000);
await task.ContinueWith(_ =>
    {
        Parallel.Invoke(
            () => {
                Console.WriteLine("Task1, thread: {0}",Thread.CurrentThread.ManagedThreadId);
            },
            () => {
                Console.WriteLine("Task2, thread: {0}", Thread.CurrentThread.ManagedThreadId);
            });
    });
于 2013-09-02T21:59:13.880 に答える