Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 并行软件设计_.net_Multithreading_Design Patterns_Concurrency_Locks - Fatal编程技术网

.net 并行软件设计

.net 并行软件设计,.net,multithreading,design-patterns,concurrency,locks,.net,Multithreading,Design Patterns,Concurrency,Locks,我有一个软件项目,需要与不同的网络主机进行通信,并对UI事件、来自不同套接字的各种网络消息、计时器等事件做出反应 我的问题是,我无法找到一个令人满意的解决方案来确保线程安全,同时仍然提供非阻塞方法。我有一些相互依赖的类,在我的想象中,我看到许多线程通过我的类的方法不受控制地跨国家运行。所以我必须为所有东西创建锁 我认为,通过添加太多的锁,我的方法几乎可以表现为阻塞锁,并产生死锁之类的错误 我需要使用.NET 3.5,但我想知道在任何语言/框架中这个问题的解决方案是什么样的(也许使用.NET>3.

我有一个软件项目,需要与不同的网络主机进行通信,并对UI事件、来自不同套接字的各种网络消息、计时器等事件做出反应

我的问题是,我无法找到一个令人满意的解决方案来确保线程安全,同时仍然提供非阻塞方法。我有一些相互依赖的类,在我的想象中,我看到许多线程通过我的类的方法不受控制地跨国家运行。所以我必须为所有东西创建锁

我认为,通过添加太多的锁,我的方法几乎可以表现为阻塞锁,并产生死锁之类的错误

我需要使用.NET 3.5,但我想知道在任何语言/框架中这个问题的解决方案是什么样的(也许使用.NET>3.5就是解决方案?)

起初,我尝试想象我的线程流,这些线程是使用Begin…()方法创建的。因此,我的第一种方法是定义一手完整的线程来维护我的应用程序的某个部分(例如,网络线程、事件线程等等)。理论上,这样可以减少锁的需求,因为资源只绑定到一个线程

由于这些线程必须关心不同的操作,我尝试实现我自己的事件队列(请参阅),但感觉如果.Net不为此提供某种模式,那么可能会有更好的解决方案来解决这些问题

我一直在阅读所有关于设计模式等的MSDN页面,这很有帮助,但我仍然看不到整个画面

我认为这是.Net或并发编程中常见的场景。也许我只是没有看到摆在我面前的解决方案。如果是这样,如果有人能给我指出正确的方向,我会很高兴

这是一个复杂的话题,很难解释。希望我能提供足够的信息。如果有什么不清楚的地方,请询问

谢谢你的帮助。

我觉得这本书很有用。基本上,您可以拥有数量不对称的生产者和消费者,例如,这允许您有多个线程为队列提供数据,而只有一个线程使用它们;或多个线程竞争处理队列中的消息


在您的情况下,来自套接字和UI事件的消息将是需要处理的数据片段,然后您可以让单个线程(在您的情况下可能是UI线程)从该队列中读取,并在UI上执行操作。这样,该线程就不需要锁定所有内容。

只需将资源设计为参与者(参与者模型)。基本上,一个带有邮箱(队列)的单线程组件可以接收命令。为什么不发布一个答案呢?谢谢你的提示。维基百科上关于演员模型的文章类似于我自己的想法。正如我在问题中所假设的那样,这种方法在.Net中似乎并不常用。虽然有第三方库,我喜欢这种方法。你需要持久的消息/命令吗?例如,如果UI执行一个操作,它是否绝对需要接收一个ACK,以确保即使系统崩溃,他的命令最终也会得到处理?我的另一个印象是UI线程通常是应用程序的主线程。这似乎也是没有可定制事件队列的借口。但是,如果您编写的应用程序没有UI,例如框架,该怎么办?有时,让多个并行线程拥有自己的消息队列对我来说似乎很有用,每个线程都没有回答我的问题。基本上,您的系统状态是只在内存中,还是持久化到磁盘?这改变了为参与者实现消息队列的方式。如果所有内容都在内存中,那么消息队列也可以是持久的,不必是持久的。否则,您需要将消息存储在磁盘上。我使用了一个关系数据库表作为poor's man队列,我在那里工作,它做得很好。不幸的是,我还不能(还)向上投票。这听起来很有帮助。似乎很难把一切都放在这个模式中。但我想整个问题的解决方案不可能是单一的模式,而是应用程序不同部分的足够模式/工具。也许这会给我更多的声誉,这样我就可以投票了;)此外,我认为我需要在第三方物流、并发模型/模式等方面更加坚定。让我们把它定义为“精髓”的一部分。谢谢大家。