Вопрос асинхронного обратного вызова API - PullRequest
0 голосов
/ 01 августа 2011

Я использую Silverlight с RIA Services, которые по своей природе асинхронны. Однако вопрос не относится к выбору этой технологии.

Я хочу обернуть асинхронный вызов, например, для веб-службы, и предоставить собственный упрощенный и слабо связанный 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 голосов
/ 01 августа 2011

Я бы сказал, если возможно, держите его на одном действительно хорошем, согласованном API.

Вероятно, лучше всего имитировать асинхронные API, которые уже существуют в .NET, которые позволяют использовать встроенный синтаксис обработки исключений:

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);
...