gpt4 book ai didi

c# - C# .NET 方法或习惯用法中 Objective-C 调度队列的等价物

转载 作者:搜寻专家 更新时间:2023-10-30 20:13:53 24 4
gpt4 key购买 nike

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

虽然线程解决方案适用于大多数语言,但 Apple 建议使用 Dispatch Queues以支持上述并发挑战(请参阅下面的摘录),其中对共享资源的请求被排队并一次处理一个以避免冲突。

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

我确实看到了 this SO问题,但在我需要的正确上下文中并没有真正的答案。

更多详情:

Excerpt from Dispatch Queues Objective-C docs :

调度队列是一种基于 C 的机制,用于执行自定义任务。调度队列串行或并发执行任务,但始终以先进先出的顺序执行。 (换句话说,调度队列总是按照任务被添加到队列中的相同顺序出队和启动任务。)串行调度队列一次只运行一个任务,等到该任务完成后再出队和启动任务新的一个。相比之下,并发调度队列会启动尽可能多的任务,而无需等待已经启动的任务完成。

调度队列还有其他好处:

它们提供了一个简单明了的编程界面。他们 提供自动和整体的线程池管理。他们提供 调谐装配的速度。它们的内存效率更高(因为 线程堆栈不会在应用程序内存中逗留)。他们不设陷阱 到负载下的内核。任务的异步调度 调度队列不能死锁队列。它们优雅地缩放在 争论。串行调度队列提供了一种更有效的选择 锁和其他同步原语。

您提交给调度队列的任务必须封装在函数或 block 对象中

编辑:事实证明,.Net“主循环”或主线程是您可以发出处理代码请求的地方。主循环是所有 UI 工作通常完成的地方。根据这个 SO 问题 The Windows GUI Main Loop in C#...where is it?您也可以通过 Application.Run 访问它和 Timer

最佳答案

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

有几个与友好管理线程相关的 .NET 选项可能有助于您尝试执行的操作。脱颖而出的是 TaskScheduler.QueueTaskThreadPool.QueueUserWorkItem . BackgroundWorker也可能适用于您在架构上令人羡慕的情况。

TaskSchedulerThreadPool 任务/线程队列的文档均未提及有关排队项目顺序的任何保证。如果您的线程任务的顺序非常重要,基于我对 .NET 框架的有限知识,您可能希望使用队列启动方法来保证自己排队,该方法接受写入请求并写入数据库或将写入排队直到写权限可用。这会有点困惑,因为您需要锁定并发性。这github hosted code来自similar SO question可能对此有好处。我没有测试过。

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

希望对你有帮助

编辑:原始问题张贴者指出的类似 SO 问题的进一步研究 Concurrent Queue .NET 4.0 的新功能,确保处理 ConcurrentQueue 队列任务中的下一个任务,如果使用常规 Queue,则无需额外的并发锁定代码。该方法将尽可能同时允许多个任务,而不是像单线程处理器线程池方法那样总是等待前一个任务完成。

关于c# - C# .NET 方法或习惯用法中 Objective-C 调度队列的等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42316103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com