次のコードでは、CancellationToken を使用して、プロデューサーが生成していないときに GetConsumingEnumerable() をウェイクアップし、foreach から抜け出してタスクを終了したいと考えています。しかし、 IsCancellationRequested がログに記録されているのが見えず、 Task.Wait(timeOut) が timeOut 期間全体を待機します。私は何を間違っていますか?
userToken.Task = Task.Factory.StartNew(state =>
{
userToken.CancelToken = new CancellationTokenSource();
foreach (var broadcast in userToken.BroadcastQueue.GetConsumingEnumerable(userToken.CancelToken.Token))
{
if (userToken.CancelToken.IsCancellationRequested)
{
Log.Write("BroadcastQueue IsCancellationRequested");
break;
...
}
}
return 0;
}, "TaskSubscribe", TaskCreationOptions.LongRunning);
後で...
UserToken.CancelToken.Cancel();
try
{
task.Wait(timeOut);
}
catch (AggregateException ar)
{
Log.Write("AggregateException " + ar.InnerException, MsgType.InfoMsg);
}
catch (OperationCanceledException)
{
Log.Write("BroadcastQueue Cancelled", MsgType.InfoMsg);
}