gpt4 book ai didi

c# - 如何取消 BlockingCollection 上的 GetConsumingEnumerable()

转载 作者:太空狗 更新时间:2023-10-29 18:16:40 26 4
gpt4 key购买 nike

在下面的代码中,我使用 CancellationToken 在生产者不生产时唤醒 GetConsumingEnumerable() 并且我想脱离 foreach 并退出任务。但我没有看到 IsCancellationRequested 被记录,我的 Task.Wait(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);
}

最佳答案

您可以使用 CompleteAdding(),这表示不会再向集合中添加任何项目。如果使用 GetConsumingEnumerable,foreach 将优雅地结束,因为它知道等待更多项目没有意义。

基本上,一旦您将项目添加到 BlockingCollection 中,只需执行以下操作:

myBlockingCollection.CompleteAdding() 

任何使用 GetConsumingEnumerable 执行 foreach 循环的线程都将停止循环。

关于c# - 如何取消 BlockingCollection 上的 GetConsumingEnumerable(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9106419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com