6 Stimmen

Instanz der Task-Klasse (Task.Factory.StartNew oder TaskCompletionSource)

Das ist wahrscheinlich eine ziemlich grundsätzliche Frage, aber ich wollte nur sicherstellen, dass ich sie richtig im Kopf habe. Heute habe ich mit der TPL-Bibliothek gegraben und festgestellt, dass es zwei Möglichkeiten gibt, eine Instanz der Task-Klasse zu erstellen.

Weg I

 Task<int> t1 = Task.Factory.StartNew(() =>
                {
                    //Some code
                    return 100;

                });

Weg II

  TaskCompletionSource<int> task = new TaskCompletionSource<int>();
  Task t2 = task.Task;
  task.SetResult(100);

Nun, ich wollte nur wissen, dass

  1. Gibt es einen Unterschied zwischen diesen beiden Fällen?
  2. Wenn ja, was dann?

4voto

adrianm Punkte 13990

Im zweiten Beispiel wird keine "echte" Aufgabe erstellt, d. h. es gibt keinen Delegierten, der etwas tut.

Sie verwenden es hauptsächlich, um dem Aufrufer eine Task-Schnittstelle zu präsentieren. Sehen Sie sich das Beispiel auf msdn

    TaskCompletionSource<int> tcs1 = new TaskCompletionSource<int>();
    Task<int> t1 = tcs1.Task;

    // Start a background task that will complete tcs1.Task
    Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000);
        tcs1.SetResult(15);
    });

    // The attempt to get the result of t1 blocks the current thread until the completion source gets signaled.
    // It should be a wait of ~1000 ms.
    Stopwatch sw = Stopwatch.StartNew();
    int result = t1.Result;
    sw.Stop();

    Console.WriteLine("(ElapsedTime={0}): t1.Result={1} (expected 15) ", sw.ElapsedMilliseconds, result);

1voto

tugberk Punkte 55751

Da Sie keine asynchrone Operation in Weg 1 oben, verschwenden Sie Zeit, indem Sie einen weiteren Thread aus dem Threadpool verbrauchen (möglicherweise, wenn Sie nicht die Standard TaskScheduler ).

Allerdings, in der Way 2, sind Sie eine abgeschlossene Aufgabe zu generieren und Sie tun es in der gleichen Thread, dass Sie ein sind. TCS kann auch als eine gewindelos Aufgabe (wahrscheinlich die falsche Bezeichnung, aber von mehreren Entwicklern verwendet).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X