Was ist AsyncCallback?

79

Was ist die Verwendung von AsyncCallback und warum sollten wir es verwenden?

Wohnmobil.
quelle

Antworten:

143

Wenn die asyncMethode die Verarbeitung beendet hat, wird die AsyncCallbackMethode automatisch aufgerufen, wo Nachbearbeitungsanweisungen ausgeführt werden können. Mit dieser Technik müssen Sie nicht abrufen oder warten, bis der asyncThread abgeschlossen ist.

Hier einige weitere Erklärungen zur AsyncVerwendung von Rückrufen:

Rückrufmodell: Das Rückrufmodell erfordert, dass wir eine Methode zum Rückruf angeben und jeden Status, den wir benötigen, in die Rückrufmethode aufnehmen, um den Anruf abzuschließen. Das Rückrufmodell ist im folgenden Beispiel zu sehen:

static byte[] buffer = new byte[100];

static void TestCallbackAPM()
{
    string filename = System.IO.Path.Combine (System.Environment.CurrentDirectory, "mfc71.pdb");

    FileStream strm = new FileStream(filename,
        FileMode.Open, FileAccess.Read, FileShare.Read, 1024,
        FileOptions.Asynchronous);

    // Make the asynchronous call
    IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length,
        new AsyncCallback(CompleteRead), strm);
}

In diesem Modell erstellen wir einen neuen AsyncCallbackDelegaten und geben eine Methode an, die (in einem anderen Thread) aufgerufen werden soll, wenn der Vorgang abgeschlossen ist. Darüber hinaus geben wir ein Objekt an, das wir möglicherweise als Status des Aufrufs benötigen. In diesem Beispiel senden wir das Stream-Objekt ein, da wir EndReadden Stream aufrufen und schließen müssen.

Die Methode, die wir erstellen, um am Ende des Aufrufs aufgerufen zu werden, sieht ungefähr so ​​aus:

static void CompleteRead(IAsyncResult result)
{
    Console.WriteLine("Read Completed");

    FileStream strm = (FileStream) result.AsyncState;

    // Finished, so we can call EndRead and it will return without blocking
    int numBytes = strm.EndRead(result);

    // Don't forget to close the stream
    strm.Close();

    Console.WriteLine("Read {0} Bytes", numBytes);
    Console.WriteLine(BitConverter.ToString(buffer));
}

Andere Techniken sind Warten bis fertig und Abrufen .

Modell " Warten bis fertig" Mit dem Modell "Warten bis fertig" können Sie den asynchronen Aufruf starten und andere Arbeiten ausführen. Sobald die andere Arbeit erledigt ist, können Sie versuchen, den Anruf zu beenden. Er wird blockiert, bis der asynchrone Anruf abgeschlossen ist.

// Make the asynchronous call
strm.Read(buffer, 0, buffer.Length);
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);

// Do some work here while you wait

// Calling EndRead will block until the Async work is complete
int numBytes = strm.EndRead(result);

Oder Sie können Wartegriffe verwenden.

result.AsyncWaitHandle.WaitOne();

Abfragemodell Die Abfragemethode ist ähnlich, mit der Ausnahme, dass der Code den abfragt IAsyncResult, um festzustellen, ob er abgeschlossen wurde.

// Make the asynchronous call
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);

// Poll testing to see if complete
while (!result.IsCompleted)
{
    // Do more work here if the call isn't complete
    Thread.Sleep(100);
}
SO Benutzer
quelle
1
Gibt es eine Möglichkeit, dies zu tun, damit CompleteRead eine nicht statische Funktion ist?
Greggorob64
1
Ja, Sie können sowohl TestCallbackAPM- als auch CompleteRead-Instanzmethoden erstellen.
SO Benutzer
32

Denk darüber so. Sie haben einige Operationen, die Sie parallel ausführen möchten. Sie würden dies aktivieren, indem Sie Threads verwenden, die asynchron ausgeführt werden. Dies ist ein Feuer-und-Vergessen-Mechanismus.

In einigen Situationen ist jedoch ein Mechanismus erforderlich, mit dem Sie feuern und vergessen können, der jedoch nach Abschluss des Vorgangs benachrichtigt werden muss. Dazu würden Sie einen asynchronen Rückruf verwenden.

Die Operation ist asynchron, ruft Sie jedoch zurück, wenn die Operation abgeschlossen ist. Dies hat den Vorteil, dass Sie nicht auf den Vorgang warten müssen, bis er abgeschlossen ist. Sie können andere Vorgänge ausführen und Ihr Thread wird daher nicht blockiert.

Ein Beispiel hierfür wäre eine Hintergrundübertragung einer großen Datei. Während der Übertragung möchten Sie den Benutzer nicht wirklich daran hindern, andere Vorgänge auszuführen. Sobald die Übertragung abgeschlossen ist, ruft der Prozess Sie zu einer asynchronen Methode zurück, bei der Sie wahrscheinlich ein Meldungsfeld mit der Aufschrift "Übertragung abgeschlossen" öffnen können.

Bobbyalex
quelle
4

AsyncCallbacks werden verwendet, um eine Funktion anzugeben, die aufgerufen werden soll, wenn eine asynchrone Operation abgeschlossen ist. Wenn Sie beispielsweise eine E / A-Operation ausführen, rufen Sie BeginRead in einem Stream auf und übergeben einen AsyncCAllback-Delegaten. Die Funktion wird aufgerufen, wenn der Lesevorgang abgeschlossen ist.

Weitere Informationen finden Sie unter:

schwer
quelle