目的 :コマンドが十分に長く実行されると、インターフェイスがブロックされます。 それらを非同期に実行することが可能であるべきです。
バックグラウンドプロセスのようなものを作成し、そこでコマンドを実行できます。 ただし、いくつかの質問がすぐに発生します。
「ストリーム内の関数でViewModelを更新する場合はどうなりますか?」 ユーザーインターフェイスのアクションに頼らずにこれを行うことはできません。
-インターフェイスに1つの影響のみが発生したときに、1つのチームが誤って複数のスレッドを呼び出さないようにする方法
-個別のスレッドで実行する必要のあるコマンドが多数ある場合、View Modelを散らばらないようにするにはどうすればよいですか?
-各システムのストリームにさまざまなオプションがある場合、WPおよびSilverlightとの互換性を確保する方法は?
AsynchronousCommandオブジェクトは、これらのニュアンスだけでなくすべてを考慮して作成されました。 知り合いになる:
public class MainViewModel : ViewModel { public MainViewModel() {
XAML要素へのバインド:
<Button Content="Asynchronous Command" Command="{Binding AsyncCommand1}" />
コマンドを呼び出した後、対応する関数が呼び出されます。この関数は、ラムダ式を使用して指定します。ラムダ式は、スレッドプールとは別のスレッドで呼び出されます。
ビューモデルオブジェクト(ユーザーインターフェイス要素に関連付けることができる)で何かを行う必要がある場合は、ReportProgress関数を使用できます。
asyncCommand1.ReportProgress(() => { Messages.Add(i.ToString()); });
ReportProgressは、送信されたコードが目的のスレッドで起動されることを保証します。これにより、必要に応じてユーザーインターフェイスを非常に簡単に変更できます。