わかりました、ここで最初の質問をする時間です...
いくつかのビュー (CF 3.5 ユーザー コントロール、OpenNETCF.IoC および resco コントロールを使用) とそれらのナビゲーション コントローラーを作成しました。
また、非常に興味深い専用ネットワーク デバイス用の抽象化レイヤー (「ドライバー」) も作成しました。コマンドはデバイス上で同期的にしか実行できませんが、私はリーダー スレッドを使用して、デバイスからのメッセージ (いつでも、または同期コマンドに応答して来る可能性があります) をリッスンします。これらのメッセージは、イベントでディスパッチするか、キューに入れることができます。
「ドライバー」インターフェースでは、次のようになります。
public Response ExecuteCommand(Command command);
<= これは同期呼び出しです。一部のコマンドは数分間実行される場合があります。
public event DeviceMessageReceivedEvent;
<= これがサブスクライブされている場合、上記のメソッドへの呼び出しに対する直接の応答ではない受信メッセージは、イベント引数でディスパッチされます。これはリーダースレッドから呼び出されます。
public Queue DeviceMessages;
<= イベントがサブスクライブされていない場合、そのようなメッセージはここに表示されます。
便利なアプリケーション ファサードもありますが、これは基本的には ExecuteCommand 呼び出しの派手なラッパーにすぎないため、ここでは省略します。
質問:
イベントおよび/またはキューで受信したデータをビューに接続する最良の方法と、ExecuteCommand メソッドに非同期ラッパーを実装する最良の方法-繰り返しますが、デバイスのネットワークの制限により同期的に実行する必要がありますプロトコル (はい、本当にひどいものです。)
.NET CF 3.5 WinForms を使用した非同期プログラミングについてかなり読んだ後、どのように進めればよいか途方に暮れています。最初のデモでは、DataBindings を多用していましたが、必要なときに Control.Invoke を使用する明確な方法がないという問題が発生しました。また、すべてのコマンドを UI スレッドと同期して実行し、イベントを使用する代わりに匿名スレッドを使用してキュー上のメッセージをポーリングすることで、非同期実行の問題を回避しました。これは、明らかな理由から変更したいと思います。
CF は BeginInvoke と EndInvoke を提供していませんが、それらは再実装するのに十分単純であると思いますか?
静的なビュー中心のモデルを作成する必要がありますか? それは問題を単純化するでしょうか?
モデル/ビューとドライバー間の状態転送を処理するために、追加の「中間」スレッドを作成する必要がありますか? それは問題を単純化するでしょうか?
...?
ここで、一般的な設計原則に関するブレインストーミングを探していると思います。私はあまり UI の人間ではなく、主にシステム プログラミングを行っていました。非同期プログラミングの概念は非常に明確ですが、このコンテキストでそれらを適用する方法はわかりません。
だから..どんな入力も高く評価され、本の推奨事項なども...