Как отменить GetConsumingEnumerable () в BlockingCollection

В следующем коде я использую 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);
}
8
задан Mo Patel 22 August 2013 в 14:07
поделиться