In C # und TPL ( Task Parallel Library ) stellt die Task
Klasse eine laufende Arbeit dar, die einen Wert vom Typ T erzeugt.
Ich möchte wissen, was für die Task.FromResult- Methode erforderlich ist.
Das heißt: In einem Szenario, in dem Sie den produzierten Wert bereits zur Hand haben, was ist die Notwendigkeit, ihn wieder in eine Aufgabe zu packen?
Das einzige, was mir in den Sinn kommt, ist, dass es als Adapter für andere Methoden verwendet wird, die eine Task-Instanz akzeptieren.
c#
.net
task-parallel-library
task
async-await
Lysergsäure
quelle
quelle
Antworten:
Ich habe zwei häufige Anwendungsfälle gefunden:
quelle
Task.FromResult
und einen Client, der asynchron auf die Netzwerk-E / A wartet. Auf diese Weise können Sie dieselbe Schnittstelle zwischen Client / Server verwendenChannelFactory
.IEnumerable<T>
aus abzuleitenIDisposable
- es ermöglicht die zählbare Einweg Ressourcen zu haben, nicht Kräfte es. WederFromResult
,async
nochawait
werden Threads erzeugen.Task
bedeutet ein Rückgabemethode " kann asynchron sein". Daher erhalten Methoden manchmal eine asynchrone Signatur, wobei sie genau wissen, dass einige Implementierungen synchron sind (z. B.NetworkStream
sollten asynchron sein, aberMemoryStream
synchron sein).Ein Beispiel wäre eine Methode, die einen Cache verwendet. Wenn das Ergebnis bereits berechnet wurde, können Sie eine abgeschlossene Aufgabe mit dem Wert (using
Task.FromResult
) zurückgeben. Wenn dies nicht der Fall ist, geben Sie eine Aufgabe zurück, die die laufende Arbeit darstellt.Cache-Beispiel: Cache-Beispiel mit Task.FromResult für vorberechnete Werte
quelle
Task.FromResult
, können zwischengespeichert werden.Task.FromResult(0)
,Task.FromResult(1)
,Task.FromResult(false)
undTask.FromResult(true)
zwischengespeichert werden. Sie sollten keine Aufgabe für einen Netzwerkzugriff zwischenspeichern, aber eine aus dem Ergebnis ist vollkommen in Ordnung. Möchten Sie es vorziehen, jedes Mal eine zu erstellen, wenn Sie den Wert zurückgeben müssen?Verwenden Sie diese Option, wenn Sie eine erwartete Methode erstellen möchten, ohne das Schlüsselwort async zu verwenden. Ich habe dieses Beispiel gefunden:
Hier erstellen Sie Ihre eigene Implementierung der IHttpActionResult-Schnittstelle, die in einer Web-API-Aktion verwendet werden soll. Es wird erwartet, dass die ExecuteAsync-Methode asynchron ist, aber Sie müssen das Schlüsselwort async nicht verwenden, um sie asynchron und wartbar zu machen. Da Sie bereits das Ergebnis haben und nichts abwarten müssen, ist es besser, Task.FromResult zu verwenden.
quelle
Von MSDN:
http://msdn.microsoft.com/en-us/library/hh228607.aspx
quelle
Verwenden Sie Task.FromResult, wenn Sie eine asynchrone Operation ausführen möchten, das Ergebnis jedoch manchmal synchron vorliegt. Ein gutes Beispiel finden Sie hier http://msdn.microsoft.com/en-us/library/hh228607.aspx .
quelle
Task.FromResult
wird verwendet, um ein zuvor zwischengespeichertes asynchrones Ergebnis zu erhalten.Ich würde argumentieren, dass Sie Task.FromResult für synchrone Methoden verwenden könnten, deren Fertigstellung lange dauert, während Sie andere unabhängige Arbeiten in Ihrem Code ausführen können. Ich würde diese Methoden lieber dazu bringen, asynchron aufzurufen. Stellen Sie sich jedoch die Situation vor, in der Sie keine Kontrolle über den aufgerufenen Code haben und diese implizite Parallelverarbeitung wünschen.
quelle