Microsoftは、この.NET4での使用例CancellationToken
を示しています。
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
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;
while (moreToDo)
{
// Poll on this property if you have to do
// other cleanup before throwing.
if (ct.IsCancellationRequested)
{
// Clean up here, then...
ct.ThrowIfCancellationRequested();
}
}
}, tokenSource2.Token); // Pass same token to StartNew.
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();
}
}
ただし、私の理解では、あるスレッドで変数が変更された場合、キャッシュが原因で別のスレッドが変更された値を取得しない可能性があります。またCancellationToken
、メインスレッドでキャンセルされるので、チェックしているスレッドが実際に最新で Task
あることをスレッドはどのように保証しますか?CancellationToken
Task
がトークンのキャッシュされた値を読み取ることができないのはなぜですか?
注:CancellationToken
これを尋ねる動機は、インスタンス変数がである必要があるかどうか疑問に思うことから生じますvolatile
。