Was wäre der beste Weg, um eine "klassische" asynchrone Methode zu konvertieren / zu verpacken, die einen Rückruf auf etwas verwendet, das eine (erwartete) Aufgabe zurückgibt?
Zum Beispiel mit der folgenden Methode:
public void GetStringFromUrl(string url, Action<string> onCompleted);
Ich weiß nur, wie ich dies in eine Methode einbinden kann, die eine Aufgabe zurückgibt:
public Task<string> GetStringFromUrl(string url)
{
var t = new TaskCompletionSource<string>();
GetStringFromUrl(url, s => t.TrySetResult(s));
return t.Task;
}
Ist dies der einzige Weg, dies zu erreichen?
Und gibt es eine Möglichkeit, den Aufruf von GetStringFromUrl (URL, Rückruf) in der Aufgabe selbst zu verpacken (dh der Aufruf selbst würde innerhalb der Aufgabe statt synchron ausgeführt)?
c#
asynchronous
task-parallel-library
c#-5.0
Philippe Leybaert
quelle
quelle
BeginXxx()
undEndXxx()
Paare. Warum suchen Sie nach anderen Möglichkeiten, dies zu tun? Was hoffen Sie zu gewinnen?TrySetResult
stattSetResult
hier zu verwenden?Antworten:
Ihr Code ist kurz, lesbar und effizient, daher verstehe ich nicht, warum Sie nach Alternativen suchen, aber mir fällt nichts ein. Ich denke, Ihr Ansatz ist vernünftig.
Ich bin mir auch nicht sicher, warum Sie denken, dass der synchrone Teil in der Originalversion in Ordnung ist, aber Sie möchten ihn in der
Task
basierten Version vermeiden . Wenn Sie der Meinung sind, dass der synchrone Teil zu lange dauert, beheben Sie ihn für beide Versionen der Methode.Wenn Sie es jedoch
ThreadPool
nur in derTask
Version asynchron (dh auf dem ) ausführen möchten, können Sie Folgendes verwendenTask.Run()
:public Task<string> GetStringFromUrl(string url) { return Task.Run(() => { var t = new TaskCompletionSource<string>(); GetStringFromUrl(url, s => t.TrySetResult(s)); return t.Task; }); }
quelle
Ihre angenommene Implementierung ist hierfür vollkommen in Ordnung, vorausgesetzt, der Rückruf behandelt immer nur erfolgreiche Situationen. Was passiert derzeit, wenn eine Ausnahme innerhalb der asynchronen Grundlagen der GetStringFromUrl-Implementierung auftritt? Es gibt keine wirkliche Möglichkeit für sie, dies an den Action-Rückruf weiterzugeben ... schlucken sie es einfach und geben Ihnen null oder so zurück?
Das einzige, was ich empfehlen würde, ist die Befolgung der neuen Konvention, solche asynchronen Methoden mit dem Suffix XXXAsync zu benennen.
quelle