非同期 I/O を行ういくつかの APM メソッドを含むライブラリを実装しています。(邪魔にならないように、Tasks、async/await、Rx、サードパーティ ライブラリなどは使用できません。)
たとえば、私の APM ライブラリ メソッドの 1 つ が、非同期 I/O を実行するために、BeginOuter()
別の APM メソッド に延期されているだけだとします。ユーザーの入力で行っている他のすべてが同期している場合、内側のfromを外側のfromとしてBeginInner()
再利用できない理由はありますか? そのような:IAsyncResult
BeginInner()
IAsyncResult
BeginOuter()
// Omitting non-APM parameters for clarity; assume these methods do synchronous work on some other input.
public IAsyncResult BeginOuter(InputStuff stuff, AsyncCallback callback, object state)
{
return BeginInner(stuff, result =>
{
callback(result);
}, state);
}
public OutputStuff EndOuter(IAsyncResult result)
{
EndInner(result);
// Do some synchronous work to get OutputStuff.
return MakeOutputStuff();
}
明らかに、BeginOuter()
複数の非同期呼び出しを連鎖させて作業を行う場合、呼び出し元に最初に待機するものだけを返すのは間違いです。しかし、非同期呼び出しが 1 つしかない場合はどうなるでしょうか。
また、私の場合、呼び出し元がBeginInner()
完了後に混乱する可能性があるとは考えられませんが、呼び出す前に、有用なことを行うEndOuter()
ために結果に依存することになります。EndOuter()
そこにあるこれに関するすべての情報を統合するのに苦労しています。IAsyncResult パターンの実装をいくつか見てきましたが、この特定のユース ケースについては、次の点を除いてあまり見つけることができません。 .aspx機微をもう少しよく理解したいと思います。
編集:私はこの質問を見ましたが、私がチェックしたときの回答はすべて「[ライブラリ]を使用する」、「別の方法で行う」、または「IAsyncResultを実装する」でした(ただし、理由には触れません)。これが許容されることなのか、それとも IAsyncResult を実装することが町で唯一のゲームなのかを理解しようとしています。