Tag: 队列

Threadsafe FIFO队列/缓冲区

我需要实现一种任务缓冲区。 基本要求是: 在单个后台线程中处理任务 从多个线程接收任务 处理所有收到的任务,即确保在收到停止信号后缓冲区的缓冲任务耗尽 必须保持每个线程接收的任务顺序 我正在考虑使用如下的队列来实现它。 希望得到有关实施的反馈。 还有其他更明智的想法来实现这样的事情吗? public class TestBuffer { private readonly object queueLock = new object(); private Queue queue = new Queue(); private bool running = false; public TestBuffer() { } public void start() { Thread t = new Thread(new ThreadStart(run)); t.Start(); } private void run() { running = true; bool […]

c#将Remove(int index)方法添加到.NET Queue类

我想使用.NET框架(3.5)中描述的通用队列类,但我需要一个Remove(int index)方法来从队列中删除项目。 我可以使用扩展方法实现此function吗? 有人想指出我正确的方向吗?

使用工作线程对项目进行排队

我一直试图找出如何解决我的要求,但对于我的生活,我只是无法想出一个解决方案。 我有一个项目数据库,它们存储一种队列。 (数据库已经实现,其他进程将向此队列添加项目。) 这些项目需要大量的工作/时间来“处理”,所以我需要能够:不断地从数据库中排队项目。 对于每个项目运行一个新线程并处理该项目,然后返回true / false它已成功处理。 (这将用于将其重新添加到数据库队列中) 但是,只有当前活动线程数(每个项目正在处理一个)小于最大线程数参数时才执行此操作。 一旦达到最大线程数,我需要停止从数据库中对项目进行排队,直到当前线程数小于最大线程数。 此时它需要继续对项目进行排队。 感觉这应该是我能想到的东西,但它不是来找我。 澄清一下:我只需要实现线程。 该数据库已经实施。

什么是使用ThreadPool的正确方法?

如果我对ThreadPool的工作方式的理解是正确的,那么其目的之一是限制在给定时间可以创建的进程中的工作线程数。 例如,如果将MaxThreads设置为5然后调用QueueUserWorkItem 30次,则将向ThreadPool发出30个请求,但这些请求中只有5个将由新线程提供服务,而其他25个请求将被添加到队列中并且当先前的请求完成并且现有线程变得可用时,一次服务一个。 但是,在下面的代码中,对Thread.Sleep(-1)的调用保证DoSomething()方法永远不会返回,这意味着当前线程永远不会对后续请求可用。 但是我对ThreadPool工作方式的理解是不正确的,因为如果它是正确的,下面的代码只打印数字0-4而不是0-29。 有人可以解释ThreadPool如何工作以及为什么下面的代码没有做我认为它应该做的事情? static void DoSomething(object n) { Console.WriteLine(n); Thread.Sleep(-1); } static void Main(string[] args) { ThreadPool.SetMaxThreads(5, 5); for (int x = 0; x < 30; x++) { ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething), x); } Console.Read(); }

绑定到队列。 UI永远不会更新

我将ListBox绑定到Queue 。 当我对项目进行入队/出列时, ListBox不会更新。 我有帮助入队/出队以提高财产变化 protected void EnqueueWork(string param) { Queue.Enqueue(param); RaisePropertyChanged(“Queue”); } protected string DequeueWork() { string tmp = Queue.Dequeue(); RaisePropertyChanged(“Queue”); return tmp; }

c#堆栈队列组合

在C#中有一些已定义的通用容器,它可以同时用作Stack和Queue吗? 我只是希望能够将元素追加到末尾或队列的前面 谢谢

在C#中实现阻塞队列

我使用下面的代码来实现和测试阻塞队列。 我通过启动5个并发线程(删除程序)来测试队列,以便将项目从队列中拉出来,阻塞队列是否为空,以及1个并发线程(加法器)将项目间接添加到队列中。 但是,如果我让它运行的时间足够长,我会得到一个exception,因为即使队列为空,其中一个卸载线程也会退出等待状态。 有谁知道为什么我得到例外? 请注意,我很想知道为什么这不起作用而不是工作解决方案(因为我可以只谷歌)。 我非常感谢你的帮助。 using System; using System.Threading; using System.Collections.Generic; namespace Code { class Queue { private List q = new List(); public void Add(T item) { lock (q) { q.Add(item); if (q.Count == 1) { Monitor.Pulse(q); } } } public T Remove() { lock (q) { if (q.Count == 0) { Monitor.Wait(q); […]

如何从打印机队列中检索列表或作业数?

我正在寻找一种从特定打印机获取列表​​或作业数量的方法。 在最好的情况下,我希望有一个“作业对象”代表一个打印作业及其在打印队列中的名称。 这是必需的,因为我需要监视打印机的状态,这样我就可以用新的一批文件重新填充打印队列而不会溢出打印假脱机程序 提前致谢! 编辑:添加解决方案的代码片段 private int GetNumberOfPrintJobs() { LocalPrintServer server = new LocalPrintServer(); PrintQueueCollection queueCollection = server.GetPrintQueues(); PrintQueue printQueue = null; foreach (PrintQueue pq in queueCollection) { if (pq.FullName == PrinterName) printQueue = pq; } int numberOfJobs = 0; if (printQueue != null) numberOfJobs = printQueue.NumberOfJobs; return numberOfJobs; }

如何在ASP.NET Web API中排队后台任务

我有一个webapi,旨在以队列方式处理报告。 该应用程序采取的步骤如下: 接收内容 将内容映射到对象并将其放入队列 轮询队列中的待处理项目 一次处理队列中的项目 我当时正在考虑使用Entity Framework来创建排队项目的数据库,例如: public class EFBatchItem { [Key] public string BatchId { get; set; } public DateTime DateCreated { get; set; } public DateTime DateCompleted { get; set; } public string BatchItem { get; set; } public BatchStatus Status { get; set; } } 我的问题 – 是否有一种更有效的方法,使用NServiceBus,BlockingCollection或ConcurrentQeueue,而不是不断轮询数据库并逐个拉出待处理的项目? 我之前没有使用过队列。 一种想法是创建一个任务队列,并在一个单独的线程上处理所有挂起的任务。 有点类似于使用线程处理队列的最有效方法,但我想确保我走最有效的路线。 […]

C#优先级队列

我正在寻找一个具有如下界面的优先级队列: class PriorityQueue { public void Enqueue(T item, int priority) { } public T Dequeue() { } } 我见过的所有实现都假设该item是IComparable但我不喜欢这种方法; 我想在将其推入队列时指定优先级。 如果不存在现成的实现,那么自己做这个的最佳方法是什么? 我应该使用什么底层数据结构? 某种自平衡树,还是什么? 标准的C#.net结构会很好。