Objective-C 等价于 C# .NET 方法或习惯用法中的调度队列
Equivalent of Objective-C Dispatch Queues in C# .NET approach or idiom
我是 C# .Net 世界的新手,正在创建一个写入 MS Access 数据库 table 的 .NET API 服务,该数据库具有完整的 table 锁,最多将有 20 人同时写入 table(我们正在摆脱 Access,但还不够快!)。我们需要确保 "writers" 不会被锁定。
虽然线程解决方案适用于大多数语言,但 Apple 建议使用 Dispatch Queues 来支持上述并发挑战(请参阅下面的摘录),其中对共享资源的请求一次排队并处理一个以避免冲突。
C# 中是否有等效的方法或习惯用法?
我确实看到了 this SO 问题,但在我需要的正确上下文中并没有真正的答案。
更多详情:
Excerpt from Dispatch Queues Objective-C docs:
调度队列是一种基于 C 的机制,用于执行自定义任务。调度队列串行或并发执行任务,但始终以先进先出的顺序执行。 (换句话说,调度队列总是按照任务被添加到队列中的相同顺序出队和启动任务。)串行调度队列一次只运行一个任务,等到该任务完成后再出队和启动任务新的一个。相比之下,并发调度队列会启动尽可能多的任务,而无需等待已经启动的任务完成。
调度队列还有其他好处:
它们提供了一个简单明了的编程接口。他们
提供自动和整体的线程池管理。他们提供
调谐装配的速度。它们的内存效率更高(因为
线程堆栈不会在应用程序内存中逗留)。他们不设陷阱
到负载下的内核。任务的异步调度
调度队列不能死锁队列。它们优雅地缩放在
争论。串行调度队列提供了一种更有效的选择
锁和其他同步原语。
您提交到调度队列的任务必须封装在函数或块对象中
编辑:
事实证明,.Net "Main Loop" 或主线程是您可以发出处理代码请求的地方。主循环是所有 UI 工作通常完成的地方。根据这个问题 The Windows GUI Main Loop in C#...where is it? You can also access it via Application.Run and Timer
我发现您的问题很有趣,并且与我可以使用更多知识的 .NET 框架领域相关,因此我对该主题进行了一些研究。给你:
有几个与 friendly-managing 线程相关的 .NET 选项可能有助于您尝试执行的操作。脱颖而出的是 TaskScheduler.QueueTask
and ThreadPool.QueueUserWorkItem
. BackgroundWorker
也可能适用于您在建筑上令人羡慕的情况。
TaskScheduler
或 ThreadPool
task/thread 队列的文档均未提及有关排队项目顺序的任何保证。如果您的线程任务的顺序非常重要,基于我对 .NET 框架的有限知识,您可能希望使用队列启动方法来保证自己排队,该方法接受写入请求并写入数据库或将写入排队直到写权限可用。这会有点混乱,因为您需要锁定并发性。 github hosted code from a similar SO question 可能对此有好处。我没有测试过。
或者,您可以使用 SetMaxThreads
将您的写入任务排队到线程池中,一次限制为一个线程。我无法保证这是否适合您的情况,或者永远不会,尽管它看起来确实很简单。
希望对您有所帮助
编辑:
原始问题发布者指出的类似 SO 问题的进一步研究,Concurrent Queue,.NET 4.0 的新功能,确保处理 ConcurrentQueue
排队任务中的下一个任务,而无需额外的并发锁代码如果使用常规 Queue
,则需要。该方法将尽可能同时允许多个任务,而不是像单线程处理器线程池方法那样总是等待前一个任务完成。
我是 C# .Net 世界的新手,正在创建一个写入 MS Access 数据库 table 的 .NET API 服务,该数据库具有完整的 table 锁,最多将有 20 人同时写入 table(我们正在摆脱 Access,但还不够快!)。我们需要确保 "writers" 不会被锁定。
虽然线程解决方案适用于大多数语言,但 Apple 建议使用 Dispatch Queues 来支持上述并发挑战(请参阅下面的摘录),其中对共享资源的请求一次排队并处理一个以避免冲突。
C# 中是否有等效的方法或习惯用法?
我确实看到了 this SO 问题,但在我需要的正确上下文中并没有真正的答案。
更多详情:
Excerpt from Dispatch Queues Objective-C docs:
调度队列是一种基于 C 的机制,用于执行自定义任务。调度队列串行或并发执行任务,但始终以先进先出的顺序执行。 (换句话说,调度队列总是按照任务被添加到队列中的相同顺序出队和启动任务。)串行调度队列一次只运行一个任务,等到该任务完成后再出队和启动任务新的一个。相比之下,并发调度队列会启动尽可能多的任务,而无需等待已经启动的任务完成。
调度队列还有其他好处:
它们提供了一个简单明了的编程接口。他们 提供自动和整体的线程池管理。他们提供 调谐装配的速度。它们的内存效率更高(因为 线程堆栈不会在应用程序内存中逗留)。他们不设陷阱 到负载下的内核。任务的异步调度 调度队列不能死锁队列。它们优雅地缩放在 争论。串行调度队列提供了一种更有效的选择 锁和其他同步原语。
您提交到调度队列的任务必须封装在函数或块对象中
编辑: 事实证明,.Net "Main Loop" 或主线程是您可以发出处理代码请求的地方。主循环是所有 UI 工作通常完成的地方。根据这个问题 The Windows GUI Main Loop in C#...where is it? You can also access it via Application.Run and Timer
我发现您的问题很有趣,并且与我可以使用更多知识的 .NET 框架领域相关,因此我对该主题进行了一些研究。给你:
有几个与 friendly-managing 线程相关的 .NET 选项可能有助于您尝试执行的操作。脱颖而出的是 TaskScheduler.QueueTask
and ThreadPool.QueueUserWorkItem
. BackgroundWorker
也可能适用于您在建筑上令人羡慕的情况。
TaskScheduler
或 ThreadPool
task/thread 队列的文档均未提及有关排队项目顺序的任何保证。如果您的线程任务的顺序非常重要,基于我对 .NET 框架的有限知识,您可能希望使用队列启动方法来保证自己排队,该方法接受写入请求并写入数据库或将写入排队直到写权限可用。这会有点混乱,因为您需要锁定并发性。 github hosted code from a similar SO question 可能对此有好处。我没有测试过。
或者,您可以使用 SetMaxThreads
将您的写入任务排队到线程池中,一次限制为一个线程。我无法保证这是否适合您的情况,或者永远不会,尽管它看起来确实很简单。
希望对您有所帮助
编辑:
原始问题发布者指出的类似 SO 问题的进一步研究,Concurrent Queue,.NET 4.0 的新功能,确保处理 ConcurrentQueue
排队任务中的下一个任务,而无需额外的并发锁代码如果使用常规 Queue
,则需要。该方法将尽可能同时允许多个任务,而不是像单线程处理器线程池方法那样总是等待前一个任务完成。