0

我正在使用一些执行异步 I/O 的 APM 方法来实现一个库。(为了解决这个问题,我不能使用 Tasks、async/await、Rx、第三方库等)

假设我的 APM 库方法之一BeginOuter()只是推迟到另一个 APM 方法BeginInner()来执行其异步 I/O。如果我对用户输入所做的一切都是同步的,我是否有任何理由不能将内部IAsyncResultfrom重用BeginInner()为外部IAsyncResultfrom ?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 是否是城里唯一的游戏。

4

1 回答 1

1

在这样的单个操作上捎带一些同步代码将起作用。

如果您添加的代码没有阻塞,调用者可能不会想到,这可能是最好的。

不将state参数传递给内部操作有点调皮——你可能应该从你的Begin...方法签名中省略它,或者如果可以的话将它传递给它。

于 2015-05-01T00:36:39.430 回答