Вопрос

Я использую сторонний ресурс (.dll) в веб-службе, и моя проблема в том, что вызов этого ресурса (вызов метода) выполняется асинхронно - мне нужно подписаться на событие, чтобы получить ответ на мой запрос.Как мне сделать это в веб-сервисе c #?

Обновить:

В отношении Ответ Солнышка:

Я не хочу делать свой веб-сервис асинхронным.

Это было полезно?

Решение

Если сторонний компонент не поддерживает стандартную модель асинхронного программирования (т.е. он не использует IAsyncResult), вы все равно можете добиться синхронизации с помощью AutoResetEvent или ManualResetEvent.Чтобы сделать это, объявите поле типа AutoResetEvent в вашем классе веб-сервиса:

AutoResetEvent processingCompleteEvent = new AutoResetEvent();

Затем дождитесь сигнала о событии после вызова стороннего компонента

// call 3rd party component
processingCompleteEvent.WaitOne()

И в обработчике события обратного вызова сигнализируйте событию, чтобы ожидающий поток продолжил выполнение:

 processingCompleteEvent.Set()

Другие советы

Предполагая, что ваш сторонний компонент использует шаблон модели асинхронного программирования, используемый во всей .NET Framework, вы могли бы сделать что-то вроде этого

    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.stackoverflow.com");
    IAsyncResult asyncResult = httpWebRequest.BeginGetResponse(null, null);

    asyncResult.AsyncWaitHandle.WaitOne();

    using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult))
    using (StreamReader responseStreamReader = new StreamReader(httpWebResponse.GetResponseStream()))
    {
        string responseText = responseStreamReader.ReadToEnd();
    }

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

От Документы MSDN:

using System;
using System.Web.Services;

[WebService(Namespace="http://www.contoso.com/")]
public class MyService : WebService {
  public RemoteService remoteService;
  public MyService() {
     // Create a new instance of proxy class for 
     // the XML Web service to be called.
     remoteService = new RemoteService();
  }
  // Define the Begin method.
  [WebMethod]
  public IAsyncResult BeginGetAuthorRoyalties(String Author,
                  AsyncCallback callback, object asyncState) {
     // Begin asynchronous communictation with a different XML Web
     // service.
     return remoteService.BeginReturnedStronglyTypedDS(Author,
                         callback,asyncState);
  }
  // Define the End method.
  [WebMethod]
  public AuthorRoyalties EndGetAuthorRoyalties(IAsyncResult
                                   asyncResult) {
   // Return the asynchronous result from the other XML Web service.
   return remoteService.EndReturnedStronglyTypedDS(asyncResult);
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top