Как выставить событие асинхронного метода? - PullRequest
1 голос
/ 28 августа 2010

У меня есть метод веб-сервиса getContactsAsync. Я понял, что когда это будет завершено, это должно вызвать событие. Как я могу (все еще асинхронно) узнать, когда метод завершен, и использовать результат?

public void GetContacts()
{
    webService.getContactsAsync()
}

public void GetContactsCompleted(object sender, getContactsAsyncCompletedEventArgs e)
{
    contacts = e.Result;
}

Я не понимаю, как я должен это использовать. Я могу думать о том, чтобы вызвать GetContacts, а затем проверить цикл, если контакты! = Null, чтобы узнать, когда он завершится. Но это заблокирует поток.

Существует ли какая-то передовая практика, типичная для этой ситуации? Спасибо за чтение!

Если я полностью вне этого, не стесняйтесь объяснять, как это на самом деле работает:)

Ответы [ 5 ]

1 голос
/ 29 августа 2010

Каждый метод DoSomethingAsync имеет соответствующее событие DoSomethingCompleted, которое вызывается по завершении метода. (См. Обзор асинхронных шаблонов на основе событий для получения дополнительной информации.) Вам необходимо прикрепить метод обработчика событий к событию webService.GetContactsCompleted, чтобы его можно было выполнить:

public void GetContacts()
{
    webService.getContactsCompleted += GetContactsCompleted;
    webService.getContactsAsync();
}

// NOTE: Should be a private method.
private void GetContactsCompleted(object sender, getContactsAsyncCompletedEventArgs e)
{ /* ... */ }

(Обратите внимание, что вам нужно будет убедиться, что обработчик событий присоединен только один раз, или он начнет вызываться несколько раз после завершения метода.)

1 голос
/ 28 августа 2010

Если вы используете веб-сервисы на основе SOAP через веб-ссылку, этот ресурс может быть тикетом.

http://msdn.microsoft.com/en-us/library/wyd0d1e5%28VS.80%29.aspx

Другой жизнеспособный подход заключается в использовании синхронных методовсервис из собственного фонового потока.

0 голосов
/ 28 августа 2010

Трудно понять из вашего вопроса, в чем проблема.

Вы можете отслеживать, когда операция завершится, установив что-либо в обработчике событий. В вашем примере кода вы устанавливаете contacts, так что вы можете просто проверить, является ли contacts null.

Если вам нужно асинхронное уведомление о завершении, например, событие, которое срабатывает после завершения операции, тогда ... э ... обработать GetContractsCompleted, потому что это именно то, для чего оно нужно.

Если вам нужно что-то более конкретное (например, WaitHandle, который сигнализируется, или Task, который завершается после завершения операции), то это можно сделать, но это немного больше работы.

0 голосов
/ 28 августа 2010
0 голосов
/ 28 августа 2010

Я не знаком с этим методом, звучит специфично для этого веб-сервиса.Однако, чтобы указать вам правильное направление, большинство асинхронных методов принимают делегат в качестве параметра и будут вызывать этот делегат после его завершения.

В зависимости от метода могут существовать параметры для вызова ошибок,статус и т. д.

Трудно получить более конкретную информацию без более конкретной информации о вашей ситуации.

...