0

winformsクライアントアプリケーションで、WCFサービスの非同期メソッド(Begin...およびEnd...)を生成しました。

アプリケーションが起動すると、サーバーに対して非同期呼び出しを行い、後でアプリケーションで使用されるデータ(国のリストなど)を取得してキャッシュします。

非同期呼び出しが完了する前に、アプリケーションのメインスレッドがこのデータを必要とする場合(コンボボックスを埋めるためなど)、非同期呼び出しが終了するまでメインスレッドをブロックしたいと思います。WCFサーバーへの冗長な呼び出しを避けたい。

Monitor / Mutexを使用しようとしましたが、メインスレッドで、メソッドが呼び出されMonitor.Enter(countryLock)たときに呼び出されました。ただし、次の例外に直面しています。BeginGetCountriesMonitor.Exit(countryLock)EndGetCountries

オブジェクト同期メソッドは、同期されていないコードブロックから呼び出されました。

Monitor.Exit(...)呼び出したのと同じスレッドを呼び出すことになっていMonitor.Enter(...)ますか?はいの場合、どうすればMonitorオブジェクトの所有者を知り、そのコンテキストで呼び出しを行うことができますか?

4

2 に答える 2

0

いいえ、メインスレッドを本当にブロックしたくありません。やりたいことは、操作が保留中であるというフラグを設定し、結果に依存する UI の部分を無効にすることです。非同期 WCF 操作から結果が返されたら、UI のこれらの部分を有効にしてデータを設定できます。

メイン スレッドをブロックすると、アプリケーションが停止したように見え、ユーザーのエクスペリエンスが低下します。

于 2012-07-23T20:23:48.770 に答える
0

Peter Richie が言ったように、UI スレッドをロックしたくはありません。本当に必要なのは「ビジー」フラグだけです。

次に、同じスレッドがブロックせずに同じモニターに2回入ることが許可されているため、説明したように Monitor.Enter でこれを実行しようとしても機能しません。

ロックする場合は、Monitor.Enter(...) を呼び出したのと同じスレッドで Monitor.Exit(...) を呼び出す必要があります。それが唯一の問題である場合は、this.BeginInvoke() を使用してこれを UI スレッドにマーシャリングすることができます。しかし、私が言ったように、シングル スレッドのシナリオで Monitor を使用してロックすることは意味がありません。

于 2012-07-23T20:32:38.317 に答える