5

Silverlight プロジェクトで RIA サービスを使用しています。クライアント側で LoadOperation クラスを使用して、サーバーからデータをロードしています。

そのデータをロードする過程で、リクエストは別のデータに対する新しいリクエストに取って代わられる場合があります。これは、サーバーに対して複数の LoadOperations が行われ、ユーザーがキャンセル ボタンをクリックしたことに基づいています。

LoadOperation を取得して「Cancel」メソッドを呼び出すと、操作はキャンセルされたように見えますが、サーバー側のコードは停止していません。フィドラーを使用すると、操作が完了し、HTTP ステータス コード 200 が返されることがわかります。

「キャンセル」を呼び出すと、サーバー上で何が行われるのでしょうか? ThreadAbortException などを呼び出すと思いますか? これは改善できますか?

4

2 に答える 2

2

そこで、逆コンパイルされたRIAサービスのソースを調べましたが、キャンセルはクライアント側のみのようです。サーバー側のプロセスは変更されません。

基本的に、を実行するoperation.Cancel()と、操作をキャンセルできることを確認し(operation.CanCancel)、キャンセル済みとしてマークを付けて、完了アクションをトリガーします。

これは、サーバー側の操作が引き続き継続されることを意味しますが、完了時に応答クライアント側では何も行われません。

操作が完了したら、operation.IsCanceledプロパティをチェックして、その操作がキャンセルされたかどうかを確認する必要があります。その場合は、結果を無視してください。

于 2012-05-31T03:39:44.957 に答える
0

私が理解していることから、ロード操作を使用したサーバー側の実行のキャンセルは利用できません。

独自のキャンセル実装を実行するのは難しいかもしれません: (DomainService ベースを使用しているか、LinqToEntitiesDomainService ベースを使用しているかによって、実装は異なります)

サービス側

サービスメソッドで新しいスレッドでロードを開始し、そのスレッドオブジェクトをセッションに配置します。スレッドオブジェクトは、DbConnection をキャンセルできるようにする必要があります...サービスメソッド (Invoke) を実行して、登録されている現在実行中のスレッドオブジェクトをキャンセルします。セッションで、セッションから削除します

クライアント側

LoadOperation オブジェクトでキャンセルを呼び出し、キャンセル リクエストを呼び出します。

1 つの注意点は、OnSessionStart をコメント アウトし、global.asax で停止して、ユーザーごとにマルチスレッドで ria サービスを実行することです。そうしないと、各リクエストは前のリクエストが完了するまで待機します (これは ria サービス スレッドに関係するものであり、私たちのスレッドではありません)。スレッド オブジェクト)

これがお役に立てば幸いです

追伸: RIA サービスと EntityFramework を使用したペシミスティック ロックにも同様のソリューションを使用しています...

于 2012-07-30T07:01:52.217 に答える