我正在使用一些执行异步 I/O 的 APM 方法来实现一个库。(为了解决这个问题,我不能使用 Tasks、async/await、Rx、第三方库等)
假设我的 APM 库方法之一BeginOuter()
只是推迟到另一个 APM 方法BeginInner()
来执行其异步 I/O。如果我对用户输入所做的一切都是同步的,我是否有任何理由不能将内部IAsyncResult
from重用BeginInner()
为外部IAsyncResult
from ?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()
将多个异步调用链接在一起来完成它的工作,那么只将调用者交给第一个等待的调用是错误的。但是如果只有一个异步调用呢?
BeginInner()
此外,在我的情况下,我无法想到调用者在完成之后但在调用之前会搞砸EndOuter()
——他们将依赖于结果EndOuter()
来做任何有用的事情。
只是很难整合所有关于这方面的信息。我已经看到了 IAsyncResult 模式的几个实现,但除了以下内容之外,我找不到关于这个特定用例的太多信息:http: //mtaulty.com/communityserver/blogs/mike_taultys_blog/archive/2005/02/21/5279 .aspx希望能更好地理解其中的微妙之处。
编辑:我确实看到了这个问题,但我检查时的回答都是“使用[库]”、“以不同的方式做”或“实施 IAsyncResult”(但没有说明原因)。我试图了解这是否可以接受,或者实施 IAsyncResult 是否是城里唯一的游戏。