C# immer die Ergebnisse von einem asynchronen Aufruf
Habe ich eine API, mit denen ich arbeite, und es hat eine begrenzte Dokumentation. Mir wurde gesagt, dass einige der Methoden, die Sie ausführt, werden asynchron aufgerufen.
Wie kann ich das Ergebnis bekommen, das diese asynchrone Aufrufe. Beachten Sie, dass bin ich nicht, tut nichts besonderes, Sie nennen die API behandelt den asynchronen Teil. Aber ich kann nicht scheinen, um eine "Antwort" zurück von diesen anrufen - ich nehme an, dass ist, weil Sie in einem anderen thread.
UPDATE - ich habe einen Teil des Codes unten. Die API verwendet eine Ereignisprozedur für den Rückruf, aber es scheint nie zu Feuer.
public partial class Window1 : Window
{
ClientAppServer newServer= new ClientAppServer();
public Window1()
{
InitializeComponent();
newServer.ReceiveRequest += ReadServerReply;
}
private void ReadServerReply(RemoteRequest rr)
{
MessageBox.Show("reading server reply");
if ((rr.TransferObject) is Gateways)
{
MessageBox.Show("you have gateways!");
}
}
private void login()
{
newServer.RetrieveCollection(typeof(Gateways), true);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
this.login();
}
- Es gibt verschiedene Paradigmen in .NET asynchrone Aufrufe. Könnten Sie einige Beispiel-code?
- Post code. In der Regel asynchrone API-Aufrufe nehmen Sie einen Delegaten als parameter - dieser Delegat wird dann aufgerufen, wenn, was auch immer, was Sie genannt ist fertig. Die delegate-Methode ist der Ort im Programm, wo bekommst du eine "Antwort".
- Wenn die API ermöglicht asynchrone Methoden, dann wird es um Methoden/Ereignisse erhalten die Ergebnisse, von denen die asynchrone Methode oder ein Weg, um Kapseln diese Methoden selbst.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mehrere Möglichkeiten, Operationen stattfinden können asynchron .NET. Da Sie nicht posten irgendwelche Besonderheiten, gebe ich einen überblick über weitere gängige Muster:
AsyncWaitHandle
Oft werden Sie finden (vor allem in der .NET framework-Klassen) Paare von Methoden benannt, mit
Begin
undEnd
(d.h. so etwas wieBeginReceive
undEndReceive
).Aufruf der begin-Funktion gibt einen
AsyncWaitHandle
- Objekt, das verwendet werden kann zum synchronisieren von threads wie ein normalesWaitHandle
(durch AufrufWaitOne
oder übergabe in der statischenWaitHandle.WaitAny
oderWaitHandle.WaitAll
Funktionen), dann ging Sie in den entsprechenden "Ende" - Funktion, um den Rückgabewert der Funktion (oder, wenn man eingetreten ist, werfen Sie die Ausnahme, die aufgetreten ist).Wenn Sie das einfach .NET-Anlage für das aufrufen einer Methode asynchron (erstellen Sie einen Delegaten für die Funktion und den Aufruf
BeginInvoke
undEndInvoke
), dann ist dies der Ansatz, den Sie verwenden müssen. Jedoch, die meisten API ' s, die haben, built-in Unterstützung für asynchrone Operationen übernimmt die eigentliche asynchrone Aufruf-Teil für Sie, so dass Sie mit richtig benanntBeginXXX
undEndXXX
Funktionen, anstatt Sie zu zwingen, erstellen Sie einen Delegaten selbst.Beispiel mit der
WaitHandle
:Oft async-Methoden sind gepaart mit Veranstaltungen, wie unten gezeigt.
Veranstaltungen
Manchmal ein Methodenaufruf asynchron abgeschlossen wird, wird ein Ereignis auslösen nach seiner Fertigstellung. Dies ist auch manchmal verwendet, in Kombination mit der
AsyncWaitHandle
Ansatz zu liefern, der die Benachrichtigung, dass der Vorgang abgeschlossen ist. Zum Beispiel, der MSMQ-Bibliotheken haben eineBeginReceive
undEndReceieve
Funktion auf das queue-Objekt, sowie einReceieveCompleted
Veranstaltung. Wenn das Ereignis ausgelöst wird, zeigt es an, dassEndReceive
kann dann aufgerufen werden, übergeben Sie in derAsyncWaitHandle
zurückgegebene Objekt vom AufrufBeginReceive
. um die eigentliche Nachricht, die empfangen wurde.Entweder Weg, Sie Heften sich an das Ereignis und verwenden Sie es wie jedes andere Ereignis.
Beispiel mit
AsyncWaitHandle
und Veranstaltungen:(irgendwo im code)
(an anderer Stelle)
Diese arbeiten in der Regel in einer Vielzahl von Möglichkeiten,...Sie halten können, die
IAsyncResult
kehrte aus dem Betrieb selbst, aber die meisten Bibliotheken passieren, dassIAsyncResult
Objekt als eine Eigenschaft, die auf Ihre besonderenEventArgs
Klasse.Es ' s auch üblich, findet der Rückgabewert wird als eine Eigenschaft auf die
EventArgs
Klasse. Während dieser Wert in Ordnung ist, wenn der Begin-operation zurückgegebenIAsyncResult
, es ist immer eine gute Idee, rufen Sie das zugehörige End-Funktion, auch wenn die Daten, die Sie brauchen, ist in derEventArgs
. Die End-Funktion ist in der Regel die Art und Weise, die Ausnahmen gefangen werden, wie gut.Rückrufe
Einen Rückruf (in .NET) ist ein Delegat, der bereitgestellt wird, um die asynchrone Funktion. Rückrufe sind in mehr als nur asynchrone Funktionen, aber in diesem Kontext sind Sie in der Regel eine Stellvertretung, die Sie liefern beim aufrufen der Funktion, die Sie anrufen wird, wenn es abgeschlossen ist.
Rückrufe sind ähnliche Ereignisse (in, dass Sie sowohl Delegierten-Basis), obwohl es ist eher ein eins-zu-eins-Korrelation zwischen der Methodenaufrufe und callbacks geliefert.
Beispiel für die Verwendung einer callback -:
Normalerweise würde man in eine Referenz auf eine Funktion, dass die Methode "call-back"), wenn es abgeschlossen ist. Für ein großartiges Beispiel für dieses Verhalten, Blick auf die BackgroundWorker und es ist RunWorkCompleted Veranstaltung. Dies wird als eine Eigenschaft und nicht als übergeben als argument, aber das gleiche Idee gilt.
Wenn Sie einige Quellcode, oder zumindest der name der API, die Sie verwenden, sind möglicherweise wir in der Lage zu sein mehr spezifisch, obwohl.
Hier ist ein einfaches Beispiel für die übergabe in der callback-Methode als argument:
Gibt es mehrere Redewendungen für die Kommunikation asynchrone Ergebnisse. Basierend auf Ihre Frage, meine beste Vermutung ist, dass Sie den Umgang mit Methoden, die Sie akzeptieren die Delegierten rufen Sie nach der Beendigung ("callbacks").
Müssen Sie eine Methode definieren, entspricht der delegate-Typ und übergeben es an die asynchrone Methode. Wenn es fertig ist, ruft es der bevollmächtigte, der Regel, wobei die Ergebnisse über eine oder mehrere der Delegaten-Parameter.
Zum Beispiel, wenn Sie haben diese asynchrone Methode:
Würden Sie es so nennen:
Erhalten Sie Ihr Ergebnis von Asynchronen aufrufen, indem ein Zeiger auf eine callback-Funktion. Bitte lassen Sie uns wissen, welche API Sie versuchen zu rufen, und jemand wird wahrscheinlich geben Sie einige Beispiel-code.
Müssen Sie die Methoden BeginInvoke und EndInvoke.
Dieser Artikel zeigt, wie das aufrufen einer Methode asynchron:
http://support.microsoft.com/kb/315582