0

(別のプロジェクトで) クラス メソッドを実行するコンソール アプリがあります。このメソッドは、Web サービスへの POST を非同期的に実行し (これは 3 分間の長い操作です)、POST の影響を受けたレコードの数を返すコールバックを持っています。その間、プログラムは 3 分もかからない他のことを続け、プログラムはコールバックが戻る前に終了します。

過去に、完了を防ぐために以下に示すように ManualResetEvent を使用しましたが、この場合、私のメソッドは別のクラス ライブラリにあり、できるだけクリーンに保ちたいと考えています。


static ManualResetEvent resetEvent = new ManualResetEvent(false)

static void Main()
{
     CallAsyncMethod();
     // Do other things...
     resetEvent.WaitOne(); // Blocks until "set"
}

void AsyncMethodCallback()
{
     // Do processing on completion...
     resetEvent.Set(); // Allow the program to exit
}

呼び出されたクラスを実行フラグで汚染することなく、これを達成するためのクリーンなパターンを考え出す手助けをいただければ幸いです。

4

2 に答える 2

5

可能であれば (特に、.NET 4 を使用している場合)、CallAsyncMethod戻り値を aTaskまたはTask<T>. その後、簡単に継続をアタッチしたり、完了するまで待機したりできます。コールバックの唯一の目的がレコード数を取得することである場合は、 a を返すTask<int>ことが理想的です。非同期メソッド内で結果を非常に簡単に入力できるTaskCompletionSource<TResult>ため、メインクラス内でコールバックはまったく必要ありません。メインクラスには次のようなメインメソッドがあります。

static void Main()
{
     Task<int> asyncTask = CallAsyncMethod();
     // Do other things...
     int count = asyncTask.Result;
     // Do anything you need with the count
}

C# 5 の新しい非同期機能は とうまく連携するように設計されているTask<T>ため、新しいバージョンがリリースされたときにすぐに受け入れることができます。

于 2012-04-17T20:06:37.433 に答える
1

別のフォアグラウンド スレッドで Web サービス リクエストを開始します。すべてのフォアグラウンド スレッドの実行が完了するまで、アプリケーションは終了しません。

new Thread(() => CallSynchronousMethod()).Start();
于 2012-04-17T20:12:32.600 に答える