Pregunta

Estoy consumiendo un recurso de terceros (un .dll) en un servicio web, y mi problema es que invocar este recurso (llamar a un método) se realiza de forma asíncrona. Necesito suscribirme a un evento para obtener La respuesta a mi petición. ¿Cómo hago eso en un servicio web c #?

Actualización :

Con respecto a Respuesta de Sunny : / p>

No quiero que mi servicio web sea asíncrono.

¿Fue útil?

Solución

Si el componente de terceros no es compatible con el modelo de programación asíncrono estándar (es decir, no utiliza IAsyncResult), aún puede lograr la sincronización mediante AutoResetEvent o ManualResetEvent. Para hacer esto, declare un campo de tipo AutoResetEvent en su clase de servicio web:

AutoResetEvent processingCompleteEvent = new AutoResetEvent();

Luego, espere a que se señale el evento después de llamar al componente de terceros

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

Y en el controlador de eventos de devolución de llamada, señale el evento para permitir que el hilo en espera continúe la ejecución:

 processingCompleteEvent.Set()

Otros consejos

Suponiendo que su componente de terceros esté utilizando el patrón de modelo de programación asíncrono utilizado en todo el .NET Framework, podría hacer algo como esto

    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();
    }

Ya que necesita que su operación de servicio web bloquee, debe usar IAsyncResult.AsyncWaitHandle en lugar de la devolución de llamada para bloquear hasta que se complete la operación.

De MSDN docs :

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);
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top