ホーム > コンピュータ > C# > WPF in C# > Prism

ベクトルドロー・レベルゼロ+

Prism Library 5.0 for WPFを使用する高度なMVVMの筋書き 04[C# WPF Prism]

新規作成日 2015-10-15
最終更新日

原文

訳文

Advanced MVVM Scenarios Using the Prism Library 5.0 for WPF(外部サイト)

パターンと実践 ディベロパー・センター

Microsoft Prism Library 5.0 for WPFの開発者のガイド原文サイト)から:

コマンド

Commands

トリガとコマンドの相互作用

Interaction Triggers and Commands

非同期相互作用を扱う

Handling Asynchronous Interactions

あなたのView Modelは、多くの場合、同期する代わりに、非同期で情報をやりとりする、あなたのアプリケーション内で、 サービスとコンポーネントと相互作用する必要があります。あなたが、Webサービスと相互作用する場合、 あるいは、ネットワークの上の他のリソースあるいは、あなたのアプリケーションが、計算やI/Oを実行するために、バックグラウンド処理を使用する場合、これは、特に、当てはまります。 これらの操作が、非同期で実行されることを確認すると、あなたのアプリケーションは、応答を維持します。それは、優れたユーザー・エクスペリエンスを提供するために重要です。

ユーザーが、非同期要求やバックグラウンド処理を始動するとき、応答がいつ現れるか(あるいは、たとえそれが現れるとしても)予測することが、難しいです。 そして、極めて頻繁に、それは、スレッドの上に戻るでしょう。UIは、UIスレッドだけで更新することができるため、 あなたは、UIスレッドに要求を送ることによって、頻繁に、UIを更新する必要があります。

データを取り出し、Webサービスで相互作用する

Retrieving Data and Interacting with Web Services

Webサービスや他のリモート・アクセス技術で、相互作用するとき、あなたは、頻繁に、IAsyncResultパターンに遭遇します。 このパターンでは、(GetQuestionnaireのような)メソッドを呼び出す代わりに、 あなたは、BeginGetQuestionnaireとEndGetQuestionnaireの一組のメソッドを使用します。 あなたが、BeginGetQuestionnaireを呼び出す、非同期呼び出しを開始するために、結果と決定を取得するために、 対象とするメソッドを呼び出すとき、例外がある場合、呼び出しが完了しているとき、あなたは、EndGetQuestionnaireを呼び出します。

EndGetQuestionnaireを呼び出すとき、決定するために、あなたは、BeginGetQuestionnaireの呼び出しの間、 完了のためのを得る、あるいは、(おそらく)コールバックを指定することができます。 ここに、示されるように、対象とするメソッドの実行が、完了しているとき、コールバックの方法で、 あなたのコールバック・メソッドは、呼び出され、あなたは、それは、EndGetQuestionnaireを呼び出すことができます。:


IAsyncResult asyncResult = this.service.BeginGetQuestionnaire(GetQuestionnaireCompleted, null // object state, not used in this example);

private void GetQuestionnaireCompleted(IAsyncResult result)
{
   try
   {
     questionnaire = this.service.EndGetQuestionnaire(ar);
   }
   catch (Exception ex)
   {
     // Do something to report the error.
     // エラーを報告するために、何かします。
   }
}

それは、Endメソッドの呼び出し(この場合、EndGetQuestionnaire)のなかで、注意することが重要です。 要求が実行される間、発生した、どんな例外でも、発生します。あなたのアプリケーションは、これらを取り扱う必要があり、 そして、UIによってスレッドを安全な方法で、それらに、報告する必要があるかもしれません。 あなたが、これらを取り扱わない場合、スレッドは、終了し、そして、あなたは、結果を処理することができないでしょう。

応答は、通常、UIスレッドではないため、あなたは、UIに状態に影響を及ぼす何かを修正する予定がある場合、 あなたは、スレッド・ディスパッチャ、あるいは、SynchronizationContextオブジェクトを使用して、 UIスレッドに応答を送る必要があるでしょう。WPFでは、あなたは、一般に、ディスパッチャを使用します。

次のコードの例では、Questionnaireオブジェクトは、非同期で取り出されます。 そして、その次に、それは、QuestionnaireViewのための、データ・コンテクストとして設定されます。 あなたは、あなたが、UIスレッドにいるかどうか、ディスパッチャのCheckAccessメソッドを使用することができます。 そうでない場合は、あなたは、要求をUIスレッドで実行するために、BeginInvokeメソッドを使用する必要があります。


var dispatcher = System.Windows.Deployment.Current.Dispatcher;
if (dispatcher.CheckAccess())
{
    QuestionnaireView.DataContext = questionnaire;
}
else
{
    dispatcher.BeginInvoke(
          () => { Questionnaire.DataContext = questionnaire; });
}

Model-View-ViewModelの参考になる実装(MVVM RI)は、前述の例に同じような、 IAsyncResultに基づくサービス・インターフェイスを利用する方法の例を示します。 また、それは、単純なコールバックの仕組みを提供するために、利用者のために、サービスをラップし、 そして、呼び出したスレッドに、コールバックを送る処理をします。 例えば、次のコードの例は、アンケ-卜用紙の検索を示します。


this.questionnaireRepository.GetQuestionnaireAsync(
    (result) =>
    {
        this.Questionnaire = result.Result;
    });

返された結果のオブジェクトは、発生する可能性があるエラーに加えて、取り出された結果をラップします。 次のコードの例は、エラーが、どのように、評価されるかを示します。


this.questionnaireRepository.GetQuestionnaireAsync(
    (result) =>
    {
        if (result.Error == null) {
          this.Questionnaire = result.Result;
          ...
        }
        else
        {  
          // Handle error. 
        }
    })

ユーザーとの対話処理パターン

User Interaction Patterns

高度な構築と接続

Advanced Construction and Wire-Up

MVVMアプリケーションをテストする

Testing MVVM Applications

詳細情報

More Information

Copyright (C) 2011-2016 kukekko All Rights Reserved.
kukekko@gmail.com
ご連絡の際はアドレスの@は半角にしてください。 また、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません 」。
inserted by FC2 system