相关疑难解决方法(0)

为什么迭代GetConsumingEnumerable()不会完全清空底层的阻塞集合

我使用任务并行库,可量化和可重复的问题BlockingCollection<T>,ConcurrentQueue<T>GetConsumingEnumerable试图创建一个简单的管道.

简而言之,从一个线程向默认值BlockingCollection<T>(引擎盖下依赖于a ConcurrentQueue<T>)添加条目并不能保证它们会BlockingCollection<T>从调用GetConsumingEnumerable()Method的另一个线程中弹出.

我创建了一个非常简单的Winforms应用程序来重现/模拟它,它只是将整数打印到屏幕上.

  • Timer1负责排队工作项...它使用一个被调用的并发字典,_tracker以便它知道它已经添加到阻塞集合中的内容.
  • Timer2只记录两个BlockingCollection&的计数状态_tracker
  • START按钮启动一个Paralell.ForEach简单地遍历阻塞集合GetConsumingEnumerable()并开始将它们打印到第二个列表框的按钮.
  • STOP按钮会停止Timer1阻止将更多条目添加到阻止集合中.
public partial class Form1 : Form
{
    private int Counter = 0;
    private BlockingCollection<int> _entries;
    private ConcurrentDictionary<int, int> _tracker;
    private CancellationTokenSource _tokenSource;
    private TaskFactory _factory;

    public Form1()
    {
        _entries = new BlockingCollection<int>();
        _tracker = new ConcurrentDictionary<int, int>();
        _tokenSource = new CancellationTokenSource();
        _factory = new TaskFactory(); 
        InitializeComponent(); …
Run Code Online (Sandbox Code Playgroud)

.net c# wpf task-parallel-library blockingcollection

17
推荐指数
2
解决办法
1万
查看次数