Как я могу вызвать асинхронный метод веб-сервиса, который возвращает void? - PullRequest
0 голосов
/ 26 августа 2009

Веб-сервис, который я вызываю из моего приложения, имеет два метода.

  1. XmlNode getCase(string parameter) // synchronous
  2. void getCaseAsync(string parameter) //async

Я могу просто вызвать метод 1 и сохранить результаты в таком xml-узле, как это,

XmlNode node=webservice.getCase("test");

но я не могу понять, как вернуть результат из асинхронного метода, возвращающего void. Я попробовал это, но получил erorr:

IAsyncResult result = webservice.getCaseAsync(("test");

Есть идеи?

Да, Брайан, вы правы, есть "завершенное" событие, которое я уже реализовал в своем классе consturcor формы, как этот,

webService.getCaseCompleted + = новый webService.getCaseCompletedEventHandler (webService_getCaseCompleted);

void webService_getCaseCompleted (отправитель объекта, webService.getCaseCompletedEventArgs e) { webService.GetCaseAsync ( "тест"); } У меня также есть кнопка в моей форме, которую я хочу запустить код оттуда. Я попробовал это, private void button1_Click (отправитель объекта, EventArgs e) { webService_getCaseCompleted (this, null); } Но я получаю сообщение об ошибке, что «е» является нулевым. Как мне запустить этот метод?

Спасибо, Dave

Ответы [ 2 ]

6 голосов
/ 26 августа 2009

Если вы говорите о прокси WCF, это будет выглядеть так:

Мой IService будет выглядеть примерно так:

[ServiceContract]
public interface IService
{
    [OperationContract]
    void DoSomething();
}

В вашем клиенте ваш код будет выглядеть так:

var serviceProxy = new MyService.Service1Client();
serviceProxy.DoSomethingCompleted += DoSomethingComplete;
serviceProxy.DoSomethingAsync();

А ваш асинхронный обратный вызов будет выглядеть так:

private void DoSomethingComplete(object sender, AsyncCompletedEventArgs e)
{
    // Handle the result
}

В завершенном обработчике вы можете проверить, успешно ли выполнен вызов службы (e.Cancelled == false и e.Error == null).

Помните. Асинхронный вызов не даст вам результат немедленно. Он сообщит вам, когда он будет завершен.

Надеюсь, это поможет?

0 голосов
/ 26 августа 2009

Если возвращаемый тип метода void, это означает, что он ничего не возвращает. Если он ничего не возвращает, вы не можете ожидать от него никакого результата, поэтому ваше назначение недействительно. Вы должны просто вызвать такие методы так:

webservice.getCaseAsync("test");

Если вы хотите, чтобы он возвращал что-то, измените тип возвращаемого метода на что-то другое, чем void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...