Могу ли я создать ярлык асинхронного шаблона Begin / End, используя событие для создания моего AsyncResult? - PullRequest
1 голос
/ 19 ноября 2010

Я бы хотел легко создавать асинхронные методы для моей службы WCF.Я знаю, что для этого нужно использовать асинхронный шаблон Begin / End и пометить мой метод Begin с помощью AsyncPattern = true.Мне интересно, действительно ли мне нужно сделать свой собственный объект AsyncResult для обработки (что я немного нервничаю из-за этого) или могу ли я использовать обработчик событий и по существу обернуть мой Begin / End вокруг вызова Begin / End обработчика событий,Это выглядит как обходной способ сделать это, но, поскольку (насколько я знаю) я не могу подписаться или вызвать событие напрямую из WCF, это выглядит как правдоподобное решение.

private event EventHandler<RequestEventArgs> OnSendRequest;

[OperationContract(AsyncPattern = true)]  // Borrowed from the interface for this example
public IAsyncResult BeginSendRequest(Request request, AsyncCallback callback, object state)
{
    EventHandler<RequestEventArgs> handler = OnSendRequest;
    if (handler != null)
        return handler.BeginInvoke(this, new RequestEventArgs(request), callback, handler);
    return null;
}

public void EndSendRequest(IAsyncResult result)
{
    EventHandler<RequestEventArgs> handler = (EventHandler<RequestEventArgs>)result.AsyncState;
    handler.EndInvoke(result);
}

ТогдаОчевидно, что-то подписывается на событие, чтобы сделать работу.Я также отбрасываю состояние объекта, переданное моему методу Begin, в пользу передачи обработчика события в качестве состояния, поэтому у меня есть доступ к нему для вызова EndInvoke.

Является ли эта опция приемлемой?(У меня ограниченные знания и понимание того, как вообще работают объект AsyncResult и асинхронное программирование.)

Ответы [ 2 ]

0 голосов
/ 26 ноября 2011

Да, я делаю то же самое с шаблоном начала / конца. Это выглядит так:

public IAsyncResult BeginInsertWorkOrder(Dictionary<String, String> workOrderData, AsyncCallback callBack, Object state)
{
    Action<Dictionary<String, String>> command = new Action<Dictionary<String, String>>(InsertWorkOrder);
    return command.BeginInvoke(workOrderData, callBack, command);
}
0 голосов
/ 19 ноября 2010

Проверка реактивных расширений для .NET (Rx).Это реализация шаблона, который вы ищете.

Дано пример :

var client = new WebClient();
var searchUri = new Uri("http://search.twitter.com/search.json?q=4sq.com");
var uploadUri = new Uri("http://localhost:8080/uploads");

IObservable<Unit> query =
    from result in client.DownloadStringAsObservable(searchUri, new object())
    let transformed = TransformResult(result)
    from upload in client.UploadStringAsObservable(
        uploadUri,
        "POST",
        transformed,
        new object())
    select upload;

var subscription = query.Subscribe(
    x => {}, // Nothing to do
    exn => 
    {
        // Do something with the exception
    }, 
    () => 
    {
        // Indicate we're finished
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...