web-dev-qa-db-ja.com

ボタンのクリック中に非同期タスクを待つことは可能ですか?

アプリに更新ボタンがあり、いくつかの非同期メソッドを使用して、表示されているアイテムのリストを更新しています。問題は、ボタンクリックのイベントハンドラーに戻り値の型のタスクを設定できないため、asyncvoidメソッドが残っていることです。したがって、ユーザーは更新ボタンを押してから、リストの再入力中にアイテムを選択すると、エラーが発生します。

ボタンクリックを処理するコードの開始:

    private async void Button_Click_1(object sender, RoutedEventArgs e)
    {


        await ViewModel.CreateMessageCommand();

それで、とにかくこのタスクが完了するのを適切に待つことはありますか?

16
Orch

コントロールのイベントハンドラーは通常voidを返すため、これを別の方法で処理する必要があります。これは、多くの場合、あなたのようなシナリオでは、読み込み中にUIのすべてまたは一部を無効にする必要があることを意味します。

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    // Make the "list" disabled, so the user can't "select an item" and cause an error, etc
    DisableUI();

    try
    {    
       // Run your operation asynchronously
       await ViewModel.CreateMessageCommand();
    }
    finally
    {
       EnableUI(); // Re-enable everything after the above completes
    }
}
22
Reed Copsey

アクションの開始時にユーザーが操作してはならないすべてのUIコントロールを無効にし、最後に有効にする必要があります。

2
Servy

1つの方法は、ビューを WPF Toolkit からBusyIndi​​catorでラップすることです。

ビューモデルにboolプロパティを指定し、開始時と終了時に値を切り替えます。

UI要素を他のすべてのコントロールの上に配置して、ユーザーの操作を防ぎますが、アニメーションのビジーメッセージを提供します。このメッセージは、更新して好きなように言うことができます。

1
ywm