为C#中的并行线程锁定单个访问变量

本文关键字:锁定 单个 访问 变量 线程 并行 | 更新日期: 2023-09-27 18:21:38

你好,我有这个代码

var queue = new BlockingCollection<int>();
            queue.Add(0);            
            var producers = Enumerable.Range(1, 3)
                .Select(_ => Task.Factory.StartNew(()=>
                    {
                    Enumerable.Range(1, queue.Count)
                            .ToList().ForEach(i =>
                                {
                                    lock (queue)
                                        {
                                            if (!queue.Contains(i))
                                            {
                                                Console.WriteLine("Thread" + Task.CurrentId.ToString());
                                                queue.Add(i);
                                            }
                                        }
                                    Thread.Sleep(100);
                                });
                    }))
                 .ToArray();
            Task.WaitAll(producers);
            queue.CompleteAdding();
                foreach (var item in queue.GetConsumingEnumerable())
                {                    
                        Console.WriteLine(item.ToString());               
                }   

但我每次都需要一个线程向队列中发布一些内容。添加(i)Enumerable.Range(1,queue.Count)将被incased,以便代码执行,直到不再有项目添加到队列中为止。我希望你能理解这个问题。换句话说,我需要这个动作无限地运行,直到我告诉它停止。有什么建议吗?

为C#中的并行线程锁定单个访问变量

很抱歉,如果不进一步解释,我无法理解你写这样东西的动机:(

以下代码对您有用吗?因为我不认为是:P

        int n = 2;
        Task[] producers = Enumerable.Range(1, 3).Select(_ => 
            Task.Factory.StartNew(() =>
                {
                    while (queue.Count < n)
                    {
                        lock (queue)
                        {
                            if (!queue.Contains(n))
                            {
                                Console.WriteLine("Thread" + Task. CurrentId);
                                queue.Add(n);
                                Interlocked.Increment(ref n);
                            }
                        }
                        Thread.Sleep(100);
                    }
                }))
            .ToArray();

我的意思是,它会一直持续下去。这就像一种向列表添加数字的奇怪方式

请解释你的目标,我们可能会帮助你。

我明白了,您需要的是.NET 4.0附带的BlockingCollection。它允许实现生产者-消费者模式。

多个线程或任务可以同时向集合中添加项目。多个使用者可以同时移除项目,如果集合变为空,则使用线程将阻塞并等待生产者添加项目。一次又一次

直到制片人会调用一个特殊的方法来识别结局,告诉消费者"嘿,别在那里等了,什么都不会来了!"。

我不张贴代码样本,因为有一些低于给定的链接。如果您只在谷歌上搜索生产者-消费者模式和/或BlockingCollection,您可以找到更多信息。