Werden Aufgaben als Hintergrundthreads erstellt?

85

Ich frage mich nur, ob die neue Task-Klasse in dot.net 4 einen Hintergrund- oder Vordergrund-Thread erstellt.

Normalerweise würde ich "IsBackground" für einen Thread festlegen, aber für eine Aufgabe gibt es kein solches Attribut.

Ich konnte keine Dokumentation dazu auf MSDN finden :-(

Steffen
quelle

Antworten:

118

Sollte nicht schwer zu überprüfen sein:

class Program
{
    static void Main()
    {
        Task
            .Factory
            .StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
            .Wait();
    }
}

Und die Antwort ist ...

ǝnɹʇ

Darin Dimitrov
quelle
Ich habe ein Problem, bei dem alle meine Aufgaben im aufrufenden Thread ausgeführt werden. Ich habe diese genaue Codezeile oben in mein Projekt eingefügt und sie meldet "falsch". Weißt du warum das sein könnte? Ich verwende .NET 4.0.
Trevor Elliott
8
Gemäß diesem Thread stackoverflow.com/questions/7889746/… wird Ihnen beim Starten einer Aufgabe kein Hintergrund-Thread garantiert, dies sollte jedoch der Fall sein, wenn Sie TaskCreationOptions.LongRunning verwenden. Ich verwende diese Option und es wird immer noch kein Hintergrund-Thread erstellt. Was gibt?
Trevor Elliott
kann es so konfiguriert werden, dass es nicht funktioniert?
Royi Namir
2
Ich glaube, Moozhes Problem könnte im Standard-Synchronisationskontext liegen. Das Verhalten kann unterschiedlich sein, je nachdem, ob Sie sich in einer WinForms-, WPF-, Web- oder Konsolenanwendung befinden, da alle unterschiedliche Standardmethoden zum Planen gleichzeitiger Aufgaben haben.
Jpierson
5
liebe deine Antwort: "ǝnɹʇ". Sehr lustig. Danke dir.
Teddy
11

Wenn Sie eine Task<T>Verwendung starten Task.Run(), dann ja.

Wenn Sie asyncund verwenden await, dann nein. Auszug von hier :

"Die Schlüsselwörter async und await führen nicht dazu, dass zusätzliche Threads erstellt werden. Async-Methoden erfordern kein Multithreading, da eine asynchrone Methode nicht in einem eigenen Thread ausgeführt wird. Die Methode wird im aktuellen Synchronisationskontext ausgeführt und verwendet Zeit für den Thread Nur wenn die Methode aktiv ist. Sie können Task.Run verwenden, um CPU-gebundene Arbeit in einen Hintergrundthread zu verschieben. Ein Hintergrundthread hilft jedoch nicht bei einem Prozess, der nur darauf wartet, dass Ergebnisse verfügbar werden. "

Steztric
quelle
1
Da Sie Task.Run verwenden, befindet es sich im Hintergrund-Thread. Wenn es jedoch auf eine Wartezeit trifft, kann es etwas Besonderes tun, um den Thread anzuhalten und auf Ergebnisse zu warten. Eine Untersuchung wert.
Steztric
0

Aufgaben werden von Threads ausgeführt, die aus dem System-Thread-Pool stammen. Ein Thread, der aus dem Thread-Pool stammt, wird standardmäßig im Hintergrund ausgeführt.

Drehrad
quelle
-1

Wenn Sie noch nicht von einer Hintergrundaufgabe überzeugt sind, versuchen Sie einfach, innerhalb einer Aufgabe wie folgt auf ein GUI-Element zuzugreifen:

public async Task<int> ProcessStuff_Async()
{
    while(true)
    {
        label1.Text = "processing next item";

um die Laufzeitausnahme zu erhalten:

Threadübergreifende Operation ungültig: Steuern Sie 'label1', auf das von einem anderen Thread als dem Thread zugegriffen wird, für den es erstellt wurde.

genau wie bei den guten alten regulären Hintergrund-Threads.

Es gibt Informationen in MSDN-Dokumenten (Stand 2017 :-), zB:

Der beste Weg, um damit umzugehen ... besteht darin, einen Hintergrund-Thread zu starten, der die Arbeit mit Task.Run erledigt , und auf sein Ergebnis zu warten . Dadurch fühlt sich die Benutzeroberfläche während der Arbeit reibungslos an.

Dieses Dokument enthält sogar einen Abschnitt What happens under the covers.

Roland
quelle
Ihre Prüfung bestätigt nur, dass die Aufgabe in einem eigenen Thread ausgeführt wird, nicht, dass der Thread ein Hintergrundthread ist. Ein Hintergrundthread ist ein Thread, der, wenn er noch ausgeführt wird, das Beenden des Programms nicht verhindert.
Sören Kuklau