Parallelzugriff auf Daten

Teil 4: Programmieren für Multi-Core-Prozessoren

Asynchrone Delegaten

Asynchrone Delegaten bieten eine angenehme Möglichkeit, um Werte zwischen einem gerufenen Thread (Worker) und seinem Aufrufer (Caller) auszutauschen. Es lassen sich beliebig viele Parameter zwischen dem Caller und Worker Thread übergeben. Entweder als Argumente im Aufruf des Worker Threads oder als Rückgabewerte bei der Beendigung des Worker.

Darüber hinaus werden Exceptions an den Ursprungs-Thread des asynchronen Delegaten weitergeleitet. Dabei ist allerdings zu beachten, dass der Worker asynchron zum Caller läuft. Dazu das folgende Beispiel, in dem zwei Strings verglichen werden, die beispielsweise aus einer Datenbank stammen können.

Zuerst das synchrone und traditionelle Modell. In dem Beispiel erfolgt zuerst das Lesen des ersten Strings (dbr.GetResult(1)) und dessen Zuweisung in String s1. Schließend wird dieser Vorgang in dbr.GetResult(2) und der Zuweisung zu String s2 wiederholt. Beachten Sie, dass die beiden Leseoperationen nacheinander ausgeführt werden:

static void CompareResults() {
DBRetriever dbr = new DBRetriever();
string s1 = dbr.GetResult(1);
string s2 = dbr.GetResult(2);
Console.WriteLine(s1 == s2 ? "Same" : "Different");
}

Um den gesamten Durchlauf dieser Prozedur zu beschleunigen, sollen im folgenden Codebeispiel die beiden Datenbankzugriffe parallel angestoßen werden. Dies ist der asynchrone Lesevorgang. An dieser Stelle nun kommen asynchrone Delegaten zum Einsatz. Der Caller einigt sich mit dem Worker Thread dabei über die Rückgabewerte. Im folgenden Beispiel ist die Verwendung der asynchronen Delegation aufgezeigt. Dabei werden zwei Rückgabewerte zurückgereicht.