0

私がやりたいのはこれです-

サービスへのプロキシ呼び出しを行い、非同期コールバックを介して別のスレッドでデータを受信したい...トリッキーな部分は、すべてのデータが取得されるまでフォアグラウンドスレッドをスリープ状態にしたいということです。

これを行うために同期メソッドを使用していない理由は、ページングを使用してデータをチャンクで返すWCFサービスのAPIを作成しているためです。
クライアントがページングを使用できるようにしたいのですが、すべてのページングコールバックをAPIに公開したくありません...APIが同期データ取得メソッドを公開しているように見せたいです。

クラスメソッドとコールバックにアクセスできるプライベート静的セマフォ(スレッドに依存しないため)を使用してみましたが、実行を一時停止する手段として単一のユニット容量があります。

まず、Semaphore.WaitOne()ステートメントを使用します。
次に、フォアグラウンドスレッドでプロキシ呼び出しを実行すると、サービスがデータ取得を処理するスレッドを作成し、制御がクライアントに返されます。
クライアントでは、すぐに2番目のSemaphore.WaitOne()ステートメントを使用します。これにより、フォアグラウンドスレッドの実行が一時停止されます。次に、「ページング完了」コールバックが別のスレッドで実行されると、Semaphore.Release()を使用しますが、フォアグラウンドスレッドが2番目のSemaphoreステートメントを通過することはなく、ロックされたままになるため、クライアントがフリーズします。

私が間違ってやっているアイデアはありますか、それとももっと効果的な別のロック設計がありますか?

4

1 に答える 1

1

実行しようとしているのがフォアグラウンドスレッドをデータ収集スレッドで待機させることである場合は、タスクの使用を検討することをお勧めします。これにより、ここで説明したことを簡単に実行できます。

System.Threading.Tasks: http: //msdn.microsoft.com/en-us/library/dd235608.aspx

いくつかのコード:

Task t = new Task(somethingToDo);
// Fire off the new task
t.Start();

// Wait for the task to finish...
t.Wait();

// Do something else...

ドキュメントのt.Wait()の詳細を必ず確認してください。タスクが失敗した場合に備えて、準備が必要ないくつかの例外があります。

于 2012-01-18T16:11:44.267 に答える