0

BeginInvoke で繰り返しメソッドを呼び出しています。各呼び出しの後、EndInvoke を呼び出します。

問題は、2 番目の呼び出しで、返された IAsyncResult の IsCompleted メンバーが、BeginInvoke 呼び出しの直後に true に設定されることです。

これにより、プログラムは 2 番目の呼び出しが完了したと見なすため、誤動作が発生します。

なぜこれを行うのですか?2番目の呼び出しが本当に完了したことをどのように検出できますか?

Declarations:
IAsyncResult ar;
Mercury.J4000.Ui.frmMain.doPrintsDelegate printCallback;


The BeginInvoke call:
ar = printCallback.BeginInvoke (jobNameArray, copies, distances, null, null);


The EndInvoke call (in another method):
printCallback.EndInvoke(ar);
4

2 に答える 2

2

私の推測では、フィールドとして宣言しているため、両方の呼び出しで同じ「ar」変数を使用していると思います。各呼び出しには独自のインスタンスが必要です。代わりにフィールドを宣言しList<IAsyncResult>、必要な配管を記述してフィールドを初期化し、各結果を各呼び出しに関連付けます。あなたは私たちがその部分であなたを助けるのに十分なコードを与えていません(実際、あなたが十分なコードを与えていないので、この答えは推測です)。

于 2010-09-23T19:29:42.993 に答える
2

私はあなたがこのようなことをしていると思います:

IAsyncResult ar;
ar = printCallback.BeginInvoke(...);
// do some other stuff
ar = printCallback.BeginInvoke(...);

2 番目の非同期操作が開始される前に最初の非同期操作が完了していない場合、IAsyncResult値が失われます。2 回目の呼び出しで上書きされます。

どういうわけか、個々の参照を追跡し、IAsyncResultそれらを作成した呼び出しに関連付ける必要があります。List1 つまたは 2 つしかない場合は、個々の変数またはコレクション (通常は配列)を簡単に追跡できます。

この質問はあなたを助けるかもしれません: デリゲートの単一のインスタンスを使用して、複数の非同期要求を開始できますか?

また、非同期デリゲートにコールバックを使用することを検討することもお勧めします。そうすれば、適切なIAsyncResultパラメーターがコールバックに渡され、あいまいさがなくなります。ただし、を使用するAsyncCallbackと、コードの大規模なリファクタリングが必要になる場合があります。

于 2010-09-23T19:42:36.127 に答える