【发布时间】:2017-07-08 01:15:33
【问题描述】:
我是 C# .Net 世界的新手,我正在创建一个 .NET API 服务,该服务写入执行全表锁定的 MS Access 数据库表,最多有 20 人同时写入表(我们正在摆脱 Access,但还不够快!)。我们需要确保“作家”不会被锁定。
虽然线程解决方案适用于大多数语言,但 Apple 建议使用 Dispatch Queues 来支持上述并发挑战(请参阅下面的摘录),其中对共享资源的请求一次排队并处理一个以避免冲突。
C#中是否有等效的方法或习语?
我确实看到了this SO 问题,但在我需要的正确上下文中它并没有真正得到答案。
更多详情:
Excerpt from Dispatch Queues Objective-C docs:
调度队列是一种基于 C 的机制,用于执行自定义任务。调度队列以串行或并行方式执行任务,但始终以先进先出的顺序执行。 (换句话说,调度队列总是按照它们被添加到队列中的相同顺序出队和启动任务。)串行调度队列一次只运行一个任务,等到该任务完成后再出队并开始一个新的一个。相比之下,并发调度队列会启动尽可能多的任务,而无需等待已经启动的任务完成。
调度队列还有其他好处:
它们提供了一个简单明了的编程接口。他们 提供自动和整体的线程池管理。他们提供 调谐组装速度。它们的内存效率更高(因为 线程堆栈不会停留在应用程序内存中)。他们不陷阱 到负载下的内核。将任务异步分派到 调度队列不能死锁队列。它们在下面优雅地缩放 争论。串行调度队列提供了一种更有效的替代方案 锁和其他同步原语。
您提交到调度队列的任务必须封装在函数或块对象中
编辑: 事实证明,.Net“主循环”或主线程是您可以请求处理代码的地方。主循环是所有 UI 工作通常完成的地方。根据这个SO问题The Windows GUI Main Loop in C#...where is it?你也可以通过Application.Run和Timer访问它
【问题讨论】:
-
因为大多数时候调度队列的顺序保证是无用的,你可以只使用基本上存在于所有语言中的线程池——它们启动起来会更有效率。如果您需要顺序调度,您通常会进行 GUI 工作,在这种情况下,您的框架会提供正确的工具(例如 WPF/WinForms 的调度程序)。对于您自己需要这种行为的罕见情况,一个简单的阻塞队列或类似的就可以了,但我会质疑设计。
-
谢谢@Voo,让我看看这些选项。
标签: c# objective-c .net multithreading synchronization