Das Aufrufen asynchronen Aufrufs in einem C # Web-Service
-
05-07-2019 - |
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.
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.
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);
}
}