TaskFactory.startNew()の「CancellationToken」とは何ですか?
-
02-10-2019 - |
質問
http://msdn.microsoft.com/en-us/library/dd988458.aspx
upd:
それでは、この記事について説明しましょう。 http://msdn.microsoft.com/en-us/library/dd997396.aspx
私はそのコードを少し変更しました:
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: :まあ、これは変更のみです task.IsCanceled
, 、これは役に立たない、私はまだすべてを手動で実装する必要があるためです。
解決
コメントのために、私は別の答えを投稿しています。
次のコードを検討してください。
var tokenSource = new CancellationTokenSource();
CancellationToken ct = tokenSource.Token;
tokenSource.Cancel();
var task = Task.Factory.StartNew(() =>
{
// Were we already canceled?
ct.ThrowIfCancellationRequested();
// do some processing
});
たとえ電話があっても tokenSource.Cancel()
タスクが実際に開始される前に発行されますが、スレッドプールからワーカースレッドを割り当てるので、システムリソースを無駄にします。
しかし、トークンの引数を指定するとき Task.Factory.StartNew
, 、ワーカースレッドを割り当てることなく、タスクはすぐにキャンセルされます。
他のヒント
タスクでのキャンセルは依然として協力的です。いくつかの重要な操作の途中でスレッドを殺すことを望まないでしょう。あなたはそれをチェックする必要があります。
CancellationTokensは、aのようなより単純な構成要素よりも優れています ManualResetEvent
たとえば、操作をカスケードまたは組み合わせることができるため、操作のシャットダウンを信号するには、アプリケーション全体のシャットダウン用に使用でき、特定のタスクをキャンセルするためにそれを組み合わせることができます。タスクは1つだけを見る必要があります CancellationToken
ただし、どちらからもキャンセルできます CancellationTokenSource
.