Was ist „CancellationToken“ in der TaskFactory.StartNew () verwendet?
-
02-10-2019 - |
Frage
http://msdn.microsoft.com/en-us/library/ dd988458.aspx
UPD :
so, lassen Sie uns in diesem Artikel diskutieren dann: http://msdn.microsoft. com / en-us / library / dd997396.aspx
Ich habe diesen Code ein wenig geändert:
static void Main()
{
var tokenSource2 = new CancellationTokenSource();
CancellationToken ct = tokenSource2.Token;
var task = Task.Factory.StartNew(() =>
{
// Were we already canceled?
ct.ThrowIfCancellationRequested();
bool moreToDo = true;
Thread.Sleep(5000);
while (moreToDo)
{
// Poll on this property if you have to do
// other cleanup before throwing.
if (ct.IsCancellationRequested)
{
Console.WriteLine("exit");
// Clean up here, then...
ct.ThrowIfCancellationRequested();
}
}
}, tokenSource2.Token); // this parameter useless
Console.WriteLine("sleep");
Thread.Sleep(2000);
Console.WriteLine("cancel");
tokenSource2.Cancel();
// Just continue on this thread, or Wait/WaitAll with try-catch:
try
{
task.Wait();
}
catch (AggregateException e)
{
foreach (var v in e.InnerExceptions)
{
Console.WriteLine(e.Message + " " + v.Message);
}
}
Console.ReadKey();
}
UPD . Nun, dies ändert sich nur task.IsCanceled
, die imho nutzlos ist, aufgrund ich sollte noch alles von Hand implementieren
Lösung
Durch Kommentare, ich bin Entsendung eine andere Antwort.
Betrachten Sie den folgenden Code ein:
var tokenSource = new CancellationTokenSource();
CancellationToken ct = tokenSource.Token;
tokenSource.Cancel();
var task = Task.Factory.StartNew(() =>
{
// Were we already canceled?
ct.ThrowIfCancellationRequested();
// do some processing
});
Auch wenn der Anruf tokenSource.Cancel()
ausgegeben wird, bevor die Aufgabe tatsächlich gestartet wurde, werden Sie noch einen Worker-Thread von Thread-Pool zuweisen, so dass Sie einige Systemressourcen verschwenden werden.
Aber wenn Sie Token Argument in Task.Factory.StartNew
angeben, wird die Aufgabe sofort abgebrochen werden, ohne dass ein Arbeiter-Thread zugeordnet wird.
Andere Tipps
Stornierung mit Aufgaben ist noch kooperativ. Sie würden nicht ein Thread getötet werden in der Mitte einige kritische Operation wollen. Sie müssen sich für sie überprüfen.
CancellationTokens sind besser als einfache Konstrukte wie ein ManualResetEvent
zum Abschalten einer Operation signalisiert, weil man sie kaskadieren oder kombinieren kann, zum Beispiel, können Sie einen für die allgemeine Anwendung Herunterfahren und Sie es mit einer zum Löschen einer bestimmte Aufgabe kombinieren. Die Aufgabe hat nur an dem einen CancellationToken
zu sehen, aber Sie können es von beiden CancellationTokenSource
aufheben.