私はasync/await
とTasks
の周りに私の頭を取得しようとしています。私は私のプログラム全体でそれを使うことができるように一つの方法をダウンしようとしています。基本的に私は作業が完了している間に私が表示したい自分自身のバージョンBusyIndicator
を持っています。ここに基本的な例があります。非同期タスクまだブロックUIスレッド
private async void OnPageLoad(object sender, RoutedEventArgs e)
{
var waitWindow = new PleaseWaitWindow();
waitWindow.Show();
await LoadCompanyContracts();
waitWindow.Close();
}
private async Task LoadCompanyContracts()
{
await Task.Run(() =>
{
Dispatcher.Invoke(() =>
{
//Work done here
});
});
}
でもこれらの2つの方法を通じて、まだ回転しないTasks
私BusyIndicator
を実装しようと、それが表示されますが、実際には、私はUIスレッドがまだブロックされていると考えているように凍結されています。どのようにしてこのコードを修正して、すべてのCPUバインドされた作業がUIスレッドをブロックしないようにすることができますか?
こんにちは、あなたはあなたのLoadCompanyContracts方法 – OrcusZ
@OrcusZこんにちはOrcusZのための空間を使ってみてください - 'await'はvoidを返すメソッドで作業することができないようです。 – CBreeze
あなたは 'Dispatcher.Invoke'を完全に避けるべきです - UIを待っているスレッドをブロックすることに変換します。 (待たされる) 'InvokeAsync'を使用してください。また、スレッドプールタスクを作成してDispatcherに呼び出すだけでは無駄です。 –