Frage

Ich bin eine Drittanbieter-Ressource (eine DLL) in einem Web-Service raubend und mein Problem ist, dass diese Ressource aufgerufen wird (Aufruf eine Methode) asynchron erfolgt - ich zu einer Veranstaltung anmelden muß, erhalten die Antwort auf meine Anfrage. Wie kann ich tun, dass in einem c # Web-Service?

Update:

Im Hinblick href="https://stackoverflow.com/questions/246791/invoking-asynchronous-call-in-ac-web-service/246892#246892"> Sunny Antwort

Ich will nicht auf meinen Web-Service asynchron machen.

War es hilfreich?

Lösung

Wenn die 3rd-Party-Komponente nicht den Standard asynchrone Programmiermodell unterstützt (das heißt es nicht IAsyncResult verwenden), können Sie noch erreichen Synchronisation Autoreset oder Manual verwenden. Um dies zu tun, ein Feld vom Typ Autoreset in Ihrer Web-Service-Klasse deklarieren:

AutoResetEvent processingCompleteEvent = new AutoResetEvent();

Dann warten Sie für das Ereignis nach dem Aufruf der 3rd-Party-Komponente signalisiert werden

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

Und in den Event-Handler Callback das Ereignis signalisiert die Warte Thread-Ausführung fortsetzen zu lassen:

 processingCompleteEvent.Set()

Andere Tipps

Angenommen, Ihre 3rd-Party-Komponente des asynchronen Programmiermodell Muster während des .NET Framework verwendet wird, verwenden Sie so etwas tun könnte

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

Da Sie Ihren Web-Service-Betrieb müssen zu blockieren, sollten Sie die IAsyncResult.AsyncWaitHandle anstelle des Rückrufs zu blockieren, bis der Vorgang abgeschlossen ist.

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);
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top