1

メソッドを変換するにはどうすればよいですか:

static void DoWork(Action<bool> onCompleteCallback)
{            
    Task doWork = new Task( ()=>Thread.Sleep(2000) );

    Action<Task> onComplete = (task) => {
        onCompleteCallback(true); // should execute on the main thread
    };

    doWork.ContinueWith(onComplete, TaskScheduler.FromCurrentSynchronizationContext());
    doWork.Start();                        
}

非同期に。

それを非同期に変換すると、違いは何ですか?

4

3 に答える 3

3

asyncandを使用する理由の 1 つは、awaitコールバックを回避することです。新しいサポートを使用することにより、メソッド自体が(または)asyncを返すことができ、コールバックを完全に渡す必要がなくなります。TaskTask<T>await

新しい async/await セットアップを使用する場合は、次のように記述します。

static Task DoWork()
{
     return Task.Run( () => /* Your work */ Thread.Sleep(2000) );            
};

実際の違いは、これをどのように呼び出すかです。コールバックを使用する代わりに、次のように記述します。

await DoWork();
// Do your callback work here - it'll automatically be mapped into the right sync context and happen after the above completes

もちろん、コールバックを still に渡して、次のように書くこともできます。

static async Task DoWork(Action<bool> onCompleteCallback)
{            
     await Task.Run( ()=>Thread.Sleep(2000) ); // Or use Task.Delay(2000) if you just want a pause...
     onCompleteCallback(true);
};

主な利点の 1 つは、コールバックを渡してロジックを「裏返し」にする必要がないことです。

于 2012-09-05T16:24:17.673 に答える
1

通常は次のように記述します。

static async Task DoWorkAsync(Action<bool> onCompleteCallback)
{            
    await Task.Delay(2000); // Simpler than starting a new task
    onComplete(true); // Will automatically be called on the original context
}

メソッドが戻る可能性があることに注意してください。ただし、他の非同期操作で作成できるように、非同期メソッドvoidから戻る方が一般的にクリーンです。Task

コメントに記載されているように、コールバックを渡す必要がないようにコードを再設計できるかどうかを確認する必要があります。ただし、さらにアドバイスするために、呼び出しコードに関するより多くのコンテキストが必要です。

于 2012-09-05T16:23:39.947 に答える
1

次のようにします。

static Task DoWork(Action<bool> onCompleteCallback)
{            
    await Task.Delay(2000);
    onCompleteCallback(true);
}

実際にはもっと簡単になります。

関数は最初に UI スレッドから呼び出されたため、メソッドは既に UI スレッドで実行されているため、コールバックを呼び出すことができます。

于 2012-09-05T16:24:16.553 に答える