async/awaitを理解しようとすると、ボタンが1つのみのサンプルWPFアプリケーションを少し作成しました。クリックされたとき、それはいくつかの仕事」を行います。期待されるスレッドでAsync-Awaitが実行されない
private async void goButtonClicked(object sender, EventArgs e)
{
WhatThreadAmI();
var task = populateRawData().ConfigureAwait(false);
WhatThreadAmI();
BusyIndicator.IsBusy = true;
await task;
WhatThreadAmI(); //this isnt on the main thread - why??
BusyIndicator.IsBusy = false;
Console.WriteLine("fin");
}
「WhatThreadAmIは」単に私が初期化時にセーブUIスレッドに現在のスレッドを比較します。
public bool IsMainThread => uiThread == Thread.CurrentThread;
私はこれの出力が真であることが予想 - falseを返すように移入生データ方式では確かに、「WhatThreadAmI」コールで - 真。 。私はここに非常に根本的な何かが欠けする必要があります知っている真
返す移入生データ方式では、「」WhatThreadAmI」コールで、Falseを、誰かが助けてくださいすることができます - 真 - 実際に何が起こる
はTrueです私はない仕上げ作業を待って、一つのスレッドがコードの実行を開始する。
[asyncはスレッドに関するものではありません](http://stackoverflow.com/q/17661428/11683)。 – GSerg
タスクを作成するときに、それが「.ConfigureAwait(false)」と表示されます。つまり、「元のコンテキストで再開する必要はありません。あなたがその仕事を待つとすぐに、あなたの文脈は変わるので、ここでは驚きはありません。単にタスクを作成してもまだそれを待たずにコンテキストを変更しないので、最初の2つの 'WhatThreadAmI'が' true'を返します。 – GSerg
は意味があります - ありがとう! – smodle