并发软件设计

时间:2017-02-16 13:47:47

标签: .net multithreading design-patterns concurrency locks

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

我的问题是我找不到令人满意的解决方案来确保线程安全,同时仍然提供非阻塞方法。我的课程完全依赖于彼此,在我的想象中,我看到很多线程通过我的课程方法在不受控制的越野中运行。所以我必须为所有东西创建锁。

我认为通过添加太多锁,我的方法几乎可以像阻塞一样,并产生像死锁一样的错误。

我需要使用.NET 3.5,但我很好奇在任何语言/框架中解决这个问题的方法(可能使用.Net> 3.5会是解决方案吗?)

首先,我尝试想象使用Begin ...()方法创建的线程流。所以我的第一种方法是定义一个完整的线程来维护我的应用程序的某个部分(例如网络线程,事件线程......)。这样我理论上可以减少锁的需要,因为资源被绑定到他们唯一的一个线程。

由于这些线程必须关心不同的操作,我尝试实现自己的事件队列(请参阅How to implement a message pump in Non-UI thread in .NET?),但感觉如果.Net不提供至少某种用于此目的的模式,可能更好地解决这些问题。

我继续阅读有关设计模式等的所有MSDN页面,这有帮助,但我仍然看不到整体情况。

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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

我觉得producer/consumer pattern很有用。基本上,您可以拥有不对称数量的生产者和消费者,例如,您可以让多个线程为队列提供服务,并且只有一个线程使用它们;或多个线程竞争处理队列中的消息。

How to: Implement a Producer-Consumer Dataflow Pattern

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