同期タスクのキャンセルを行う方法を探しています。次のようなタスクがあります。
public Task AddAsync(CancellationToken cancellationToken)
{
Task result = Task.Factory.StartNew(() =>
{
// So wait forever
var wait = new ManualResetEvent(false);
var waitIndex = WaitHandle.WaitAny(new[] { wait,
cancellationToken.WaitHandle});
switch (waitIndex)
{
case 0:
Debug.WriteLine("Everything fine");
break;
case 1:
Debug.WriteLine("Cancelled");
Thread.Sleep(5000);
cancellationToken.ThrowIfCancellationRequested();
break;
}
return;
}, cancellationToken);
return result;
}
非同期メソッドは次のように呼び出されます。
var ts = new CancellationTokenSource();
var t = AddAsync(ts.Token);
if (!t.Wait(TimeSpan.FromSeconds(5)))
{
ts.Cancel();
}
したがって、タイムアウト後にキャンセルを呼び出しますが、タスクのキャンセルに時間がかかります。では、どうすれば同期キャンセル呼び出しを行うことができますか?