我是C#.Net世界的新手,正在创建一个.NET API服务,该服务写入执行完全表锁定的MS Access数据库表,同时将有多达20个人同时写入该表(摆脱Access,但还不够快!)。我们需要确保“作家”不会被锁定。
尽管线程解决方案可以使用大多数语言运行,但Apple建议使用Dispatch Queues支持并发挑战,例如上述(请参见下面的摘录),在该挑战中,对共享资源的请求将同时排队并处理一次,以避免冲突。
C#中是否有等效的方法或习惯用法?
我确实看到了这个问题,但是在我需要的正确环境中并没有真正的答案。
更多细节:
摘自Dispatch Queues Objective-C文档:
调度队列是用于执行自定义任务的基于C的机制。分派队列可以串行或并发地执行任务,但始终以先进先出的顺序执行。(换句话说,调度队列始终以添加任务到队列的顺序出队列并启动任务。)串行调度队列一次仅运行一个任务,直到该任务完成后才出队列并启动任务。新的一个。相比之下,并发调度队列可以启动尽可能多的任务,而不必等待已经启动的任务完成。
调度队列还有其他好处:
它们提供了简单明了的编程界面。它们提供自动的整体线程池管理。它们提供了调整后的装配速度。它们具有更高的内存效率(因为线程堆栈不会停留在应用程序内存中)。它们不会在负载下捕获到内核。任务到调度队列的异步调度不能使队列死锁。他们在竞争中优雅地扩展。串行调度队列为锁和其他同步原语提供了更有效的替代方法。
您提交给分派队列的任务必须封装在函数或块对象中
编辑:事实证明,.Net“主循环”或主线程是您可以在其中请求处理代码的地方。主循环是通常完成所有UI工作的地方。根据这个SO问题,C#中的Windows GUI主循环在哪里?您也可以通过Application.Run和Timer访问它
我发现您的问题很有趣,并且与我可以使用更多知识的.NET框架领域有关,因此我对该主题进行了一些研究。干得好:
有几个与友好管理线程相关的.NET选项可能会对您尝试执行的操作有所帮助。突出的表现是TaskScheduler.QueueTask
和ThreadPool.QueueUserWorkItem
。BackgroundWorker
也可能适用于您在架构上令人羡慕的情况。
文档TaskScheduler
或ThreadPool
任务/线程队列均未提及有关排队项目顺序的任何保证。如果线程任务的顺序非常重要,则基于我对.NET框架的有限了解,您可能希望使用队列启动器方法来保证自己的排队,该方法接受写入请求并写入数据库或将写入队列直到可以使用写权限。这将有点混乱,因为您需要锁定并发。这个来自GitHub的类似问题的托管代码可能对此有所帮助。我还没有测试。
或者,您可以使用来将写入任务排队到一次限制一个线程的线程池中SetMaxThreads
。尽管看起来很简单,但我无法保证适合您的情况,甚至永远不会。
希望能有所帮助
编辑:从相似的,所以问题的进一步研究,指出了原题的海报中,并发队列,新的使用.NET 4.0,保证了处理下一任务移出的ConcurrentQueue
排队任务,而不需要额外的并发锁码,如果经常Queue
使用。该方法将允许在可能的情况下同时执行多个任务,而不是像在单线程处理器线程池方法中那样始终等待上一个任务完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句