hi,
in einem Beispiel habe ich zum ersten Mal async und await statements gesehen. Die entsprechende Doku dazu habe ich gelesen. Hier mein Zwischenergebnis:
Eine async methode wird immer nebenläufig gestartet, sobald sie ein await statement enthält.
Wenn ich irgendwann das Ergebnis dieser Methode haben möchte, verwende ich meinerseits ein await statement.
Daher muss die aufrufende Methode wieder async sein (denn await statements sind nur in async-methoden erlaubt).
Jetzt die Frage: Was wenn ich diesen Mechanismus nicht benutzen möchte?
Ich habe eine Library, die diesen Mechanismus verwendet. Aber ich möchte den ganzen Kram erstmal synchon haben.
Beispiel: meine Library Methode berechnet die n-te Primzahl. Das dauert. Trotzdem kann ich folgendes schreiben
public asnyc Task\<Int64\> getNthPrime(Int64 n)
{
return await lib.getSinglePrime(n);
}
Tatsache ist, dass meine methode wieder asynchron ist. Wenn ich aber möchte, dass erstmal alles blockiert, weiß ich nicht, wie das aussehen soll.
Intuitiv hätte ich sowas erwartet
public Int64 getNthPrime(Int64 n)
{
Task\<Int64\> resultTask = lib.getSinglePrime(n);
resultTask.RunSynchronously();
return resultTask.result;
}
solche Konstrukte erscheinen mir irgendwie logisch (ohne jetzt groß Ahnung davon zu haben). Trotzdem haben bisher alle meine Versuche nur zu Exceptions geführt.
Bitte bedenken, ich habe mein Beispiel stark vereinfacht. Konkret sieht mein Code derzeit so aus:
var cts = new CancellationTokenSource();
cts.CancelAfter(readTimeout\_ms);
cts.Token.Register(onReadTimeoutAction);
Task\<Int64\> primeTask = lib.getSinglePrime(n, cts);
???? how to wait ????
Int64 prime = primeTask.Result;
cts.Dispose();
Ihr seht also: ich möchte einen benutzerdefinierten Timeout haben und die library arbeitet mit der CancellationTokenSource-Klasse, von der ich auch nichts weiß.
Das Problem ist simpel aber irgendwie muss ich anfangen