非同期プログラミングがより自然になります。
C# が async/await をサポートするようになりました。Anders Hejlsberg がここで
述べた
ように、これらすべてにより、レスポンシブなアプリケーションを作成できます。私たちのチームも非同期が好きです。しかし、.net v.4.0 用にコーディングしているため、便宜上いくつかのヘルパー メソッドを開発する必要がありました。
しかし、非同期操作を使用すればするほど、それは難しくなります。
ほんの一例:
GUI のマスター詳細部分があります。ユーザーがマスターアイテムをクリックすると、かなり長い操作が詳細を取得し始めます。この操作は、db リクエストやファイルのダウンロードのように、本質的に止められないことがあります。そのため、UI の応答性を維持するために、この長い操作を非同期で開始します。
ここで、マスター アイテム リストをどうするかを決める必要があります。
ユーザーがアイテムを変更して新しい操作を開始できるようにすることができます。すでに実行中の操作の結果は、すぐに破棄するか、キャッシュに入れることができます。
そして、ユーザーが item1、item2、そして item1 をもう一度クリックしたとします。彼がこれをかなり迅速に行うと、item1 の既に開始されていてキャンセルされていない操作がまだ完了していない可能性があります。この場合、新しい操作を開始するよりも、この操作の結果を待つ方がよいでしょう。したがって、現在実行中の操作のキャッシュが存在する必要があります。(await を使用してこれを簡単に行う方法がわかりません)
確かに、操作が完了するまでマスター項目リストを無効にすることはできますが、UI の他の部分はライブのままですが、あまりユーザーフレンドリーではありません。
2 番目の例 (最初のものへのアップグレード):
GUI の詳細部分は 2 つのリストで構成されています。各リストの内容は、選択したマスター アイテムによって異なります。それに加えて、一方のリストでの選択が他方のリストの状態を変更するという方法で、リストは互いに影響します。(はい、非常に複雑なユースケースです)。
では、両方のリストのデータを非同期で取得したい場合はどうすればよいでしょうか?
どのリストが競争に勝ち、そのデータを最初に取得するかは事前にはわかりません。これは本当に問題ではありません。重要なのは勝者の存在そのものです。リスト 1 が完了し、ユーザーが選択を変更します...しかし、この選択が、まだ入力されていないリスト 2 の状態に影響するのを待ちます。ここでも、両方のリストがロードされる前に選択を禁止できますが、ユーザーがリストに対して実行できる独立した操作は多数あります。したがって、これは選択ではありません。
わかりました、どうすればいいですか?さて、両方のリストがロードされたときに開始されるタスクを紹介できます。このタスクでは、現在の選択を取得し、必要に応じて状態を設定できます。
そして、ポイントは何ですか?一般的な
並列プログラミングについて読んだことがありますが、ユーザーの操作によって GUI の状態が (実行フローの観点から) ランダムに変更されるため、GUI は非常に特殊なケースであると考えています。GUI 関連の設計パターン (MVC、MVP、MVVM) があるため、特別な並列パターンが必要です。
これが私の質問です:
一般的な非同期 GUI タスクに対応する専用の並列パターンは存在しますか?
PSこの質問がprogrammers.stackexchangeにより適していると思われる場合は、自由に移行してください。ありがとうございました。