C#.NET方法或习惯用法中的Objective-C调度队列的等效项

无声

我是C#.Net世界的新手,正在创建一个.NET API服务,该服务写入执行完全表锁定的MS Access数据库表,同时将有多达20个人同时写入该表(摆脱Access,但还不够快!)。我们需要确保“作家”不会被锁定。

尽管线程解决方案可以使用大多数语言运行,但Apple建议使用Dispatch Queues支持并发挑战,例如上述(请参见下面的摘录),在该挑战中,对共享资源的请求将同时排队并处理一次,以避免冲突。

C#中是否有等效的方法或习惯用法?

我确实看到了这个问题,但是在我需要的正确环境中并没有真正的答案。

更多细节:

摘自Dispatch Queues Objective-C文档

调度队列是用于执行自定义任务的基于C的机制。分派队列可以串行或并发地执行任务,但始终以先进先出的顺序执行。(换句话说,调度队列始终以添加任务到队列的顺序出队列并启动任务。)串行调度队列一次仅运行一个任务,直到该任务完成后才出队列并启动任务。新的一个。相比之下,并发调度队列可以启动尽可能多的任务,而不必等待已经启动的任务完成。

调度队列还有其他好处:

它们提供了简单明了的编程界面。它们提供自动的整体线程池管理。它们提供了调整后的装配速度。它们具有更高的内存效率(因为线程堆栈不会停留在应用程序内存中)。它们不会在负载下捕获到内核。任务到调度队列的异步调度不能使队列死锁。他们在竞争中优雅地扩展。串行调度队列为锁和其他同步原语提供了更有效的替代方法。

您提交给分派队列的任务必须封装在函数或块对象中

编辑:事实证明,.Net“主循环”或主线程是您可以在其中请求处理代码的地方。主循环是通常完成所有UI工作的地方。根据这个SO问题,C#中的Windows GUI主循环在哪里?您也可以通过Application.RunTimer访问它

stackuser83

我发现您的问题很有趣,并且与我可以使用更多知识的.NET框架领域有关,因此我对该主题进行了一些研究。干得好:

有几个与友好管理线程相关的.NET选项可能会对您尝试执行的操作有所帮助。突出的表现是TaskScheduler.QueueTaskThreadPool.QueueUserWorkItemBackgroundWorker也可能适用于您在架构上令人羡慕的情况。

文档TaskSchedulerThreadPool任务/线程队列均未提及有关排队项目顺序的任何保证。如果线程任务的顺序非常重要,则基于我对.NET框架的有限了解,您可能希望使用队列启动器方法来保证自己的排队,该方法接受写入请求并写入数据库或将写入队列直到可以使用写权限。这将有点混乱,因为您需要锁定并发。这个来自GitHub类似问题的托管代码可能对此有所帮助。我还没有测试。

或者,您可以使用来将写入任务排队到一次限制一个线程的线程池中SetMaxThreads尽管看起来很简单,但我无法保证适合您的情况,甚至永远不会。

希望能有所帮助

编辑:从相似的,所以问题的进一步研究,指出了原题的海报中,并发队列,新的使用.NET 4.0,保证了处理下一任务移出的ConcurrentQueue排队任务,而不需要额外的并发锁码,如果经常Queue使用。该方法将允许在可能的情况下同时执行多个任务,而不是像在单线程处理器线程池方法中那样始终等待上一个任务完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C#中创建“案例类”的最佳实践/习惯用法

在Objective-C中使用C ++类-为什么要使用PImpl习惯用法?

C ++ 11中弃用了哪些C ++习惯用法?

可以使用while(file >> ...)C ++习惯用法来读取Cython中的文件吗?

即将在C ++中添加模块是否可以解决/减轻对pimpl习惯用法的需求?

如何最好地在C ++中实现“ newtype”习惯用法?

PIMPL习惯用法,用于指向C ++中的类的指针

带有继承的C ++检测习惯用法失败

C ++擦除删除习惯用法与对象

与Java静态块等效的C ++习惯用法是什么?

C ++中等效的有效Java Builder习惯用法?

使用期望函数指针的C库时的C ++习惯用法?

C ++ 20`constinit`是否可以放弃对漂亮的计数器习惯用法的需求?

现代的C ++习惯用法,用于分配/取消分配I / O缓冲区

声明模板类成员和构造函数时的C ++习惯用法

C ++习惯用法:如何将右值作为右值传递?

C ++标准库是否提供更简洁,更通用的“擦除删除”习惯用法版本?

C ++ 11异常设计。习惯用法和最佳做法发生了变化?

volatile关键字和RAII习惯用法(C ++)

从int | double转换为string的简洁C ++习惯用法是什么?

是否存在用于写入STDOUT或文件的C ++习惯用法?

NET C#中的Maven等效项

具有从NameBase类到模板Name类的相关性的C ++习惯用法(或模式)

C#中的wtol等效项

C#中的Curl -F等效项

C#中的Java Map等效项

什么是C#中的DefaultAWSCredentialsProviderChain等效项

C#中的Promise等效项

JavaScript中的C#字典等效项