2

私にはやや重要な仕事があります。それをよりよく解決する方法について、あなたから聞いていただければ幸いです。一言で言えば、これはさまざまな性質の長期実行タスクを管理することです。これをWindowsPhoneで行っている間、C#および.NETの標準的なアプローチに基づいて、いくつかの一般的な原則をここに適用できると思います。

私のアプリケーションは主に、クラウド、GPS、商取引、認証などからのデータを処理するさまざまなサービスクラスを中心に構築されています。すべてのサービスは私たちのチームが所有しています。サービスはビューモデル内で使用されますが、さまざまなサービスのAPIは現在さまざまな方法で使用されています。どこか非同期/待機、どこかイベントベース(ポジショニングのように、地理座標を絶えず更新する必要があります)。

これで、アプリケーションのアクティブ化/非アクティブ化の問題を調査し始めました。これをすべてのビューモデルで共通の方法で処理したいと思います。主なことの1つは、アプリが閉じているとき、またはユーザーが別のページに移動したときに、現在の非同期操作をキャンセルすることです。コードの重複を避けるために、それに関連するコードをBaseViewModelのようなものに入れたいと思います。ただし、これは、すべてのビューモデルでキャンセルを均一に処理する必要があることを意味します。

ここに課題があります。たとえば、async/awaitのものはCancellationTokenによってキャンセルされる可能性があります。BaseViewModelですべてのキャンセルトークンを収集し、必要に応じてそれらをすべて使用することができました。ただし、これはイベントベースの非同期では機能しません。もちろん、仮想関数呼び出しを介して、具体的なキャンセル操作を子ビューモデルに委任することもできます。しかし、できるだけ多くのコードをBaseViewModelに移動したいと思います。

では、タスクのキャンセルとイベントベースの非同期を統合する方法はありますか?

4

2 に答える 2

2

イベント駆動型コンポーネントに対してインフラストラクチャが機能しないのはなぜですか? CancellationToken(Source)キャンセルが発生したときに呼び出されるトークンでコールバックを登録できます。そのコールバックで、イベント ソースからサブスクライブを解除できます。一般的に言えば、システムを静止させるために必要なあらゆるアクションを実行できます。キャンセルに関係するすべてのコンポーネントにトークンを配布するだけです。

CancellationToken(Source)実はこれがインフラの「美」です。とてもシンプルですが、とても一般的に適用できます。

于 2013-01-31T19:12:56.867 に答える
0

イベント ベースのパターンは多少不均一であるため、操作ごとにケースバイケースのコードを記述しない限り、完全にクリーンなソリューションが存在するとは思えません。いくつかのオプションは次のとおりです。

  • 非タスクベースの非同期操作をタスクにラップして、統一されたアプローチを提供します。かなり退屈なコードが必要です (EAP の不均一性のため)。

  • タスク サブスクリプションとイベント サブスクリプションの両方を単純なキャンセル デリゲートでラップし、代わりに基本クラスにこれらのキャンセル アクションを認識させます (単なるアクションではなく、比較的単純なものかもしれません)。

いずれにせよ、キャンセルのためにイベントごとのコードを記述する必要があるように思えますが、タスクおよびイベント ベースの操作の情報を格納するためのいくつかのヘルパー メソッドを使用すると、非常に軽量になる可能性があります。

于 2013-01-31T17:44:10.427 に答える