异步API回调设计问题

时间:2011-08-01 08:57:09

标签: silverlight asynchronous callback api-design

我正在使用带有RIA服务的Silverlight,它本质上是异步的。然而,问题并不是针对这种技术选择的。

我想为一个Web服务包装一个异步调用,并提供我自己的简化和松散耦合的API(例如:DomainClient上的存储库)。

到目前为止,我的界面中有以下样式的异步方法:

public void DoAsyncWork(Action<AsyncWorkResult<someResultType>> callback);

我正在考虑添加以下重载:

public void DoAsyncWork(Action<someResultType> onSuccess, 
                        Action<Exception> onException);

public void DoAsyncWork(Action<someResultType> onSuccess,
                        Action<Exception> onException,
                        Action finally);

onSuccess操作仅在异步调用成功完成时执行,onException执行,以防调用报告错误,finally woul执行结束在任何一种情况下。

我的问题是,实施了第一种风格,即“一般风格”,最常用的(据我所知),我应该实施另外两种风格吗?他们是否值得开发和维护投资?

这个问题与设计方面有关,与任何要求无关。

提前致谢:)

1 个答案:

答案 0 :(得分:0)

如果可能的话,我会说保留一个非常好的,一致的API。

最好模仿.NET中已存在的异步API,它允许您使用内置的异常处理语法:

public IAsyncResult BeginAsyncWork(AsyncCallback callback, object state);
public SomeResultType EndAsyncWork(IAsyncResult res);

使用方法如下:

BeginAsyncWork(res =>
{
    // BeginAsyncWork calls this once it completes, even on error.

    // res is IAsyncResult -- the same one BeginAsyncWork returns.
    // res.AsyncState is whatever the users passed in the 'state' parameter.

    try
    {
        // To get the result, and possibly an exception, EndAsyncWork is called.
        SomeResultType r = EndAsyncWork(res);
    }
    catch(Exception ex)
    {
        // EndAsyncWork throws the exception.
    }
    finally
    {
        //
    }
}, null);