在Json中对抽象队列<T>进行解压缩
我有一个抽象类KVP的队列.我排队2个从KVP继承的不同对象.当我将队列序列化时,一切正常,但是由于无法构建KVP,因此在避难所中失败了. 如果它是一个非通用对象,我可以作为动态化,但是我不确定如何对可以容纳事件和ID的队列进行挑选. 示例代码: public virtual async Task LoadFromFile(string FileName, bool addToExistingQueue,bool DeleteFileAfterLoad = true) { try { IFile File = await PCLStorage.FileSystem.Current.LocalStorage.GetFileAsync(FileName); var serializedText = await File.ReadAllT
20 2024-04-26
编程技术问答社区
如何在一个时间范围内从队列中删除重复的项目?
我想以有效的方式从队列中删除重复条目. 队列具有带有Datetime和FullPath的自定义类,还有其他一些内容 private Queue SharedQueue; 插入队列时,类中的日期时间是时间戳.我想使用的逻辑如下:如果在4秒的窗口中完全相同(即,如果在重复的FullPath的4秒内添加到队列),则从队列中删除重复项.我有我想观看的活动,但仍然会有一些重复的内容,没关系. 我正在使用C#2.0和Filesystemwatcher类和一个工作队列. 有很多方法可以做到这一点: 每次添加一个项目时,或者当我在队列上跳过当前重复项的处理时,将队列修剪. . 还是我应该使用"全局私有"变量字典?所以我可以快速搜索吗?还是队列的本地副本?如果许多文件事件,也许最好将本地队列限制为100个项目?尽管在我的情况下,它应该是一个相对较少的文件可以在文件夹中监视...但是事情总是会改变... 感谢您的任何帮助. :编辑:2月
16 2024-04-26
编程技术问答社区
Brokeredmessage 微软服务总线队列ReceiveBatch没有获得所有死信的消息
我正在用Microsoft Service Bus测试一个带有死信队列的项目.我发送26条消息(代表字母),并使用一个程序,该程序在接收消息时,将其中一些随机放在死信队列中.这些消息始终从"死信"队列中以窥视模式读取,因此一旦到达那里,它们就会呆在那里.运行几次后,所有26条消息都将在"死信"队列中,并始终留在那儿. 但是,在阅读它们时,有时只读几个(例如6),有时全部26. 我使用命令: const int maxToRead = 200; // It seems one wants to set this higher than // the anticipated load, obtaining only some back IEnumerable dlIE = deadletterSubscriptionClient.ReceiveBatch(
14 2024-04-26
编程技术问答社区
具有序列值的项目的并发队列
我正在使用ConcurrentQueue存储我系统中发生的某个活动的结果(ASP.NET Core 6).它运行良好. 但是现在我有一个新的要求:我需要Result.Id属性 - a long值,类似于顺序数据库主键.当我加入项目时,它必须在序列中获得下一个值,即queue.Count + 1. 当我加入物品时,我不使用锁,因为ConcurrentQueue为我做到了.但是现在需要Id,我必须: 锁定访问Enqueue() 确定队列的大小 通过一个增量 设置项目的Id 招募项目 或: 锁定访问Enqueue() 招募项目 确定队列的新尺寸 更新项目的Id(但在此之前将处于不一致的状态) 我可以在不锁定Enqueue()方法的情况下执行此操作吗?也许有更好的方法? (尽管我更喜欢在可能的情况下继续使用ConcurrentQueue,因为它已经对我拥有的东西很好.) 解决方案 添加项目时不要分配ID,而是可以在将项目添
16 2024-04-26
编程技术问答社区
在枚举队列的同时插入队列
我想使用队列 对树进行广度的首次搜索 var q = new Queue(); q.Enqueue(Root); foreach(T root in q) { foreach(T t in root.Children) q.Enqueue(t); } 但是,我得到了"在实例化枚举后进行了修改".例外. 我可以使用C#类型吗? 编辑:一点点阅读使我做的事情我可能会做错了. 是否有一种方法可以使用foreach从队列中脱离? 这有效,但很丑陋(OMHO) var q = new Queue(); q.Enqueue(Root); while(q.Count > 0) { T root = q.Dequeue(); foreach(T t in root.Children) q.Enqueue(t); } 解决方案 您无法通过一个可以枚举的iNumerable进行枚举,并同时更改相同的iEnumerab
28 2024-04-26
编程技术问答社区
C#按钮点击排队
我有一个按钮点击事件处理程序,其中包含一个开关盒,该操作箱在一个事件处理程序中控制多个按钮. 我需要使用队列,因为当单击一个按钮并进行一些处理时,第二个按钮单击不会干扰第一个按钮,而是添加到队列中.我不想使用.enabled=false;,因为它将完全丢弃第二次点击,而我目前正在编辑某人的软件,所以我不想破坏我不知道的东西,所以您是什么建议? 解决方案 我确实用 system.collections.队列 代码是: private Queue Button_Queue = new Queue(); private bool isProcessing = false; private void Button_Click((object sender, EventArgs e){ if(isProcessing){ Button_Queue.Enqueue(this); } else { isProcessing
24 2024-04-25
编程技术问答社区
在每次Enqueue()之后,队列中的所有值都变得相同。
我正在通过套接字接收一些数据,并试图将其添加到队列中,以便可以被另一个线程较慢,类似于缓冲区的线程. . 问题在于,每次我加入新值时,队列中的所有值都会成为. byte[] aux = new byte[1464]; aux = (byte[])ar.AsyncState; //add the package to the package fifo list lock (lockPktBuffer) { packetBuffer.Enqueue(aux); } 首先,我以为我正在通过指针,所以所有条目都指向相同的变量. 所以我尝试这样做:
28 2024-04-25
编程技术问答社区
队列排序
我有一系列项目,分类,以便最古老的项目在数组中首先. 我想从数组中加载队列,因此当我在队列上弹出项目时,最古老的项目首先出现. 我该怎么做? 解决方案 使用linq到对象... var q = new Queue(array.OrderBy(d => d.date)); 编辑:操作,错误的方式. 其他解决方案 如果您知道您的数组已经排序最古老的,则可以使用: Queue q = new Queue(yourSortedArray); 如果数组未预选,则可以使用linq: 对其进行排序 Queue q = new Queue(yourUnsortedArray.OrderBy(x => x.YourDateProperty)); 然后,您只需调用q.Dequeue以最古老的订单获取项目. 其他解决方案 您想要一个优先级排队.那么您的传
12 2024-04-25
编程技术问答社区
如何在几个线程中并行处理一个文件的数据,并在保持原有数据顺序的情况下将其写入另一个文件(C#)。
我想问您一个一个普遍的问题(即使我对如何在C#中实现它相当感兴趣) . 我有一个庞大的文件,我想通过块读取,在几个线程中以某种方式处理块以使处理更快,然后以与读取原始数据块相同的顺序将处理的数据写入另一个文件(即,确保将第一个数据块从输入文件中读取并首先保存在输出文件中,第二个块将被处理并保存为输出文件的第二个数据块,等等.). 我正在考虑以某种方式实施生产者 - 消费者(即连续从原始文件中读取块 - 喂食一组线程会从中读取和处理数据的队列),但我不知道如何编写处理已处理的数据从这些线程到输出文件,以保持数据顺序.即使我试图将线程产生的处理的数据块放在可以将它们消耗并写入输出文件的另一个队列中,我仍然无法控制从线程返回的数据的顺序(因此将其写入按正确顺序的输出文件). 有什么建议? 我是这些东西的新手,所以即使是理论上的提示对我来说意义重大. 解决方案 虽然这个问题有点开放式,并且没有代码... 解决这个问题的方法各种方法,它们都完全取决于 限制.
16 2024-04-25
编程技术问答社区
使用一个或多个标准FIFO队列来实现延迟队列
延迟队列是一个队列,其中每条消息具有与之关联的延迟时间,并且只有在其延迟过期时才能获取消息.队列的头部是该消息,其延迟在过去最远.如果没有延迟到期,则没有头部,dequeue将返回null. 实际上,我正在使用Azure编写一个云应用程序,在Azure中只有FIFO队列可用,而不是优先级/延迟队列.所以我来到这里看,如果有人可以从可以朝着正确的方向开始的地方给我一些指针.我谷歌搜索了很多,但只了解了Java中的延迟队列实现,没有标准教程/研究论文,该论文一般而言. 编辑: 我有什么代码? 实际上,我必须首先设计此功能并将其呈现给我的经理,并且一旦我们完成了设计,只有我才能开始编码. 有关场景的更多详细信息 它是基于主/从模型的分布式应用程序.主产生消息并将其放入Azure Service Bus队列中,并且有多个从队列中读取并预言它们的奴隶(在多个计算机上运行).如果主人倒下,那么其中一个从奴隶起到主人的身份并开始产生消息.我不想将任何状态信息存储在大师中,因
20 2024-04-23
编程技术问答社区
实现自定义通用列表/队列/堆栈组合的一种有效方法
我发现多次需要将通用集合视为一个时间点的列表,在另一个时间将堆栈或队列视为列表.对于我当前正在开发的应用程序,使用三个单独的对象是没有意义的. 我想到的最简单的解决方案是在标准列表上实现队列/Deceue/push/pop/peek函数.另外(未包含在下面的代码中),在t上应用了接口约束,允许该类维护每个列表,队列和堆栈的位置/序数索引. public class List: System.Collections.Generic.List { private object SyncRoot = new object(); public void Enqueue (T item) { lock (this.SyncRoot) { this.Add(item); } } public T Dequeue () { T it
24 2024-04-23
编程技术问答社区
带有序列ID的螺纹安全固定尺寸的圆形缓冲液
我需要一个具有这些功能的队列: 固定大小(即圆形缓冲区) 队列项目具有ID(如主键),是顺序的 线程安全(来自多个ASP.NET核心请求) 避免锁定,i 尝试过 A ConcurrentQueue,但发现了比赛条件.所以我正在尝试一种自定义方法. public interface IQueueItem { long Id { get; set; } } public class CircularBuffer : LinkedList where T : class, IQueueItem { public CircularBuffer(int capacity) => _capacity = capacity; private readonly int _capacity; private long _counter = 0; private readonly object _lock = new();
20 2024-04-23
编程技术问答社区
建议将TPL用于长寿线的使用
我已经阅读了任务并行库的一些MSDN文档( http://msdn.microsoft.com/en-us/library/dd537609(v = vs.110). > 我有一个启动线程的应用程序.线程的目的是监视已添加的队列和"过程"项目.队列上的项目的处理需要顺序进行,因此我不希望立即处理多个项目.该线程只有在Windows过程中才能生存,并且仅在应用程序退出时关闭. 我想知道使用TPL的任务开始此背景线程的优点和缺点. 我的最初直觉本能不是使用TPL,因为我将在运行应用程序的整个生命中占用线程池线程,这可能会阻止其他任务运行并干扰线程池的最佳运行. 我不确定如何手动启动新的背景线程执行工作,会影响tpl在应用程序的其他隔离部分中的任何用法. 我想知道在这种情况下推荐的方法是手动线程或任务?或我还需要考虑哪些其他考虑来做出明智的选择? 我已经包含了下面的代码.请注意,代码中的"处理器"通常进行CPU绑定操作,然后"处理程序"通常进行IO绑定操作:
10 2024-04-23
编程技术问答社区
检查 JavaScript setTimeout 是否已触发
我希望能够通过JavaScript派遣一堆工作以在浏览器中完成,以使浏览器始终响应. 我要采用的方法是缩小工作,将每个块传递给一个函数,然后用setTimeout(func, 0)呼叫排队. 我需要知道所有工作何时完成,因此我将返回的计时器ID存储在地图(ID-> true | false)中.我拥有计时器ID之后,该映射设置为false在下一个代码中,而排队的函数将映射设置为True完成后……当然,排队函数不知道其计时器ID. 也许有一种更好/更轻松的方法...或关于如何操作我的地图的一些建议? 解决方案 我会在数组中排队工作,一旦队列为空,请使用一个超时处理队列并调用回调.类似: var work = [...]; var run = function(work, callback) { setTimeout(function() { if(work.length > 0) { process(work
28 2024-04-22
编程技术问答社区
排队执行的多线程方法
all,我有一种称为TaskSpin的通用方法,在此方法中,我启动了Task Task,aScipied continutation public TaskSpin(Func asyncMethod, object[] methodParameters) { ... asyncTask = Task.Factory.StartNew(() => asyncMethod(uiScheduler, methodParameters)); asyncTask.ContinueWith(task => { // Finish the processing update UI etc. } ... } 问题现在是我想使用TaskSpin运行多种方法,但是我需要限制一次运行一次的方法.因此,在某些DataGridView中,我想做 之类的事情 foreach (DataGridViewRow
24 2024-04-22
编程技术问答社区
什么是并行处理队列的好策略?
我正在编写一个程序,该程序需要递归通过文件夹结构进行搜索,并希望与多个线程并行进行. 我已经编写了相当微不足道的同步方法 - 最初将根目录添加到队列中,然后排出目录,排队的子目录等,直到队列为空为止.我将使用 ConcurrentQueue 意识到我的循环会过早停止.第一个线程将脱离根目录,并且其他每个线程都可以看到队列是空的和退出的,将第一个线程作为唯一一个运行的线程.我希望每个线程循环循环,直到队列为空,然后等到另一个线程排队排队更多目录,然后继续前进.我需要循环中的某种检查站,以便在每个线程达到循环结束之前都不会退出,但是我不确定当确实没有更多目录的目录过程. 解决方案 使用任务平行库. 创建 Task 处理第一个文件夹.在此过程中,创建一个Task来处理每个子文件夹(递归)和每个相关文件的任务.然后等待所有文件夹的任务. TPL运行时将利用线程池避免创建线程,这是一个昂贵的操作.对于小工作. 注意: 如果每个文件的工作是微不足道的,而不
22 2024-04-22
编程技术问答社区
调用OnMessage()后,BrokeredMessage被自动处理了。
我正在尝试从Azure服务总线中排队项目,以便我可以批量处理它们.我知道Azure Service Bus有一个接收机(),但由于以下原因似乎有问题: 我一次只能收到256条消息的最大值,甚至可以根据消息大小随机. 即使我窥视了多少消息在等待,我也不知道有多少个请求打电话来进行拨打,因为我不知道每个呼叫会给我回馈多少消息.由于消息将不断出现,因此我不能只继续提出请求,因为它永远不会为空. 我决定只使用邮件侦听器,该消息听者比浪费偷看便宜,并且会给我更多的控制. 基本上,我试图让一定数量的消息堆积,并且 然后立即处理.我用计时器强制延迟,但我需要 能够在我的物品进来时排队. 根据我的计时器要求,似乎不是一个不错的选择,所以我试图使用consturrentbag. var batchingQueue = new ConcurrentBag(); myQueueClient.OnMessage((m) => { Cons
14 2024-04-22
编程技术问答社区
排队等候服务电话
我正在实施大量使用WCF服务的Silverlight应用程序,我到了现在,有时有几个长的服务呼叫可以阻止其他服务调用. 这些服务电话最终会超时.我想看看是否有可能对一个接一个地执行服务的队列系统,这种方式会召集其他电话,但不会导致他们超时. 我正在使用服务代理来包装服务调用 public interface IExampleServiceAgent { void ProcessData(int a, string b, EventHandler callback); } Public ExampleServiceAgent1 : IExampleServiceAgent { ExampleClient _Client = new ExampleClient(); public void ProcessData(int anInt, string aString, EventH
14 2024-04-21
编程技术问答社区
原子化地从并发队列中提取所有东西
我有多个线程生成项目并将其粘贴在常见的ConcurrentQueue中: private ConcurrentQueue queuedItems = new ConcurrentQueue(); private void BunchOfThreads () { // ... queuedItems.Enqueue(new GeneratedItem(...)); // ... } 我还有另一个单一的消费者线程,但是在此应用程序的上下文中它需要工作的方式,偶尔需要抓住当前在线程队列中的所有内容,将其从中删除队列,一枪.类似: private Queue GetAllNewItems () { return queuedItems.TakeEverything(); //
30 2024-04-21
编程技术问答社区
在托管服务中添加多个队列
我正在使用 https://lealen.microsoft.com/en-us/aspnet/core/fundamentals/host/host/hosted-services?view= aspnetcore-3.1&tabs=visual-studio-studio-studio example./p> 这就是我的代码的外观: 在startup.cs中,我添加了我的托管服务和背景队列 services.AddHostedService(); services.AddSingleton(); 然后,我实现了范围的服务,托管服务和背景队列如下: 在 namespace Services.Services { public class QueuedHostedService: BackgroundService {
14 2024-04-21
编程技术问答社区