Ist es immer möglich, einen neuen Thread mit Task zu erzwingen?

8

Ich versuche jedes Mal, wenn Task.Factory.StartNew aufgerufen wird, einen neuen Thread zu erstellen. Die Frage ist, wie man den folgenden Code ausführt, ohne die Ausnahme auszulösen:

%Vor%

EDIT: der neue Code Wenn Sie die erste for Anweisung kommentieren, gibt es kein Problem. Aber wenn Sie es haben, WOW, wird die Nachricht "Thread wiederverwendet" in die Konsole geschrieben. Kannst du das erklären, weil ich wirklich verwirrt bin?

%Vor%     
mynkow 26.11.2012, 18:05
quelle

4 Antworten

2

Hallo und vielen Dank für die Antworten. Ihr habt alle +1. Alle vorgeschlagenen Lösungen haben für meinen Fall nicht funktioniert. Das Problem ist, dass wenn Sie einen Thread schlafen, es zu einem bestimmten Zeitpunkt wiederverwendet wird. Die Leute oben vorgeschlagen:

  • mit LongRunning = & gt; Dies funktioniert nicht, wenn Sie geschachtelt / untergeordnet sind Aufgaben
  • benutzerdefinierter Taskplaner = & gt; Ich habe versucht, mein eigenes zu schreiben und habe das auch versucht ThreadPerTaskScheduler die auch nicht funktionieren.
  • mit reinen Threads = & gt; Immer noch schief ...
  • Sie können dieses Projekt auch unter Multithreading.Scheduler github überprüfen

Meine Lösung

Ich mag es nicht, aber es funktioniert. Grundsätzlich blockiere ich den Thread, so dass er nicht wiederverwendet werden kann. Unten sind die Erweiterungsmethoden und ein funktionierendes Beispiel. Nochmals vielen Dank.

Ссылка

%Vor%     
mynkow 28.11.2012, 08:29
quelle
16

Wenn Sie beim Starten der Aufgabe TaskCreationOptions.LongRunning angeben, Dies liefert dem Scheduler einen Hinweis , den der Standardplaner als Indikator zum Erstellen eines neuen Threads für die Aufgabe verwendet.

Es ist nur ein Hinweis - ich bin nicht sicher, ob ich mich darauf verlassen würde ... aber ich habe keine Gegenbeispiele mit dem Standard-Scheduler gesehen.

    
Jon Skeet 26.11.2012 18:08
quelle
4

Wenn Sie nach Jon Skeets Antwort garantieren möchten, dass jedes Mal ein neuer Thread erstellt wird, können Sie Ihr eigenes TaskScheduler schreiben, das einen neuen Thread erstellt.

    
SLaks 26.11.2012 18:09
quelle
2

Starten Sie einfach Threads mit neuem Thread () und dann Start () sie

%Vor%

Aufgaben sollen vom Scheduler verwaltet werden. Die ganze Idee von Aufgaben ist, dass die Laufzeit entscheidet, wann ein neuer Thread benötigt wird. Auf der anderen Seite, wenn Sie andere Threads benötigen, ist die Wahrscheinlichkeit, dass etwas anderes im Code falsch ist, wie eine Überabhängigkeit von Thread.Sleep () oder lokalem Thread-Thread.

Wie bereits erwähnt, können Sie Ihren eigenen TaskScheduler erstellen und Aufgaben verwenden, um Threads zu erstellen, aber warum sollten Sie dann mit Tasks beginnen?

    
Stilgar 26.11.2012 20:00
quelle

Tags und Links