多线程应用程序的策略

时间:2009-12-01 15:27:25

标签: c# multithreading refactoring synchronization

我可能会继承一个有点复杂的多线程应用程序,它目前有几个带有2 + k loc的文件,从各处访问的大量全局变量以及我认为非常臭的其他实践。

在我开始使用当前模式添加新功能之前,我想尝试看看我是否可以更好地使应用程序的基本架构。这是一个简短的描述:

  • App在内存中列出了数据列表listA,listB
  • App具有数据的本地副本(用于脱机功能)dataFileA,dataFileB
  • App有线程tA1,tB1,用于将脏数据从客户端更新到服务器
  • 线程tA2,tB2将脏数据从服务器更新到客户端
  • 线程tA3,tB3将脏数据从内存列表更新为本地文件

对于我应该研究的不同模式,策略,编程实践等方面我有点麻烦,以便掌握相关知识以做出最佳决策。

这是我为自己发明的一些目标:

  1. 让应用尽可能稳定
  2. 让通用实习生轻松添加新功能(每个新的EditRecordX.cs中有大量禁止使用50行样板代码)
  3. 降低复杂性
  4. 感谢您提供有关此项目的任何关键字或其他提示。

4 个答案:

答案 0 :(得分:2)

对于Quibblesome的优秀建议,我还可以补充一点,使用immutable objects通常是降低线程问题风险的有效方法。 (不可变对象,如.NET和Java中的字符串,一旦创建就无法修改。)

答案 1 :(得分:1)

我建议另一个目标是删除/减少全局状态并尽可能频繁地保留堆栈信息,以减少竞争条件和奇怪的线程问题。

也许值得一看,你是否可以将tA2,tB2,tA3和tB3合并到相同的线程中来杀死一些。如果不可能,请考虑将它们置于一个外观(一个与UI和与服务器通信的服务之间移动数据请求有关的线程)。这样“面向用户”的代码只需处理一个客户端而不是两个客户端。 (我不认为备份是一个客户端,因为这听起来像是一个单向的过程。)

如果线程(UI和Facade)等待彼此完成他们的请求,那么这应该防止在“推送更新”的同时发生“拉动更新”。

答案 2 :(得分:1)

为了进行一般性的改变,你会想看看Martin Fowler的Refactoring: Improving the Design of Existing Code(其中大部分在the refactoring website上)和Refactoring to Patterns。您还可能会发现Working Effectively with Legacy Code对支持安全更改很有用。除了更简单的代码在多线程环境中更容易处理之外,这对于多线程来说都没有那么多帮助。

答案 3 :(得分:0)