2009-12-01 156 views
1

我可能会继承一套较为复杂的多线程应用程序,它目前拥有2 + K LOC几个文件,很多来自世界各地的访问全局变量和其他做法的,我会考虑的很臭。策略多线程应用程序

在我开始增加与当前模式的新功能,我想试试,看看我可以让应用程序的基本架构更好。这里有一个简短的说明:

  • 应用在数据存储列表,listA的,数组listB
  • App有数据的本地副本(用于离线功能)dataFileA,dataFileB
  • App有螺纹TA1,TB1这更新从客户脏数据到服务器
  • 线程TA2,点tB2更新从服务器脏数据到客户端
  • 线程之间。tA3,TB3更新从内存列表中的脏数据到本地文件

我有点对我应该看看,以有知识,使这个最好的决定有什么不同的模式,战略,规划实践等麻烦。

这里的一些目标,我已经发明了自己:

  1. 保持应用程序尽可能保持稳定
  2. 很容易让通用实习生添加新的功能(大禁忌至50行的样板在每个新EditRecordX.cs代码)
  3. 降低复杂性

感谢您的任何关键字或其他的技巧,这可以帮助我在这个项目上。

回答

1

我建议另一个目标是删除/减少全局状态,并保持在堆栈上的信息尽可能多地减少竞争条件和怪异的线程问题的可能性。

也许它可能是值得看的,如果你可以将TA2,点tB2,Ta3与TB3到同一个线程杀几个。如果这是不可能的,可以考虑将它们放在一个Facade(一个线程,该线程涉及在UI和与服务器交谈的服务之间移动数据请求)。这是“面向用户”的代码只需要处理一个客户而不是两个客户。 (我不把备份当作客户端,因为这听起来像是单向过程)。

如果线程(UI和立面)彼此等待完成他们的请求,那么这应该防止出现“拉更新”在同一时间发生的事情为“推进更新”。

+0

“可以通过删除/减少全局状态并尽可能多地保存堆栈上的信息”您能澄清一下吗,我不确定您的堆栈是什么意思? – Morri 2009-12-01 16:27:44

+0

堆栈我的意思是传入当前方法的参数。这是堆栈顶部的内容。如果您删除全局状态,而是想方设法将相关信息作为参数传递(甚至可能使用深复制来避免对线程A上的引用进行操作以更改线程B正在处理的数据),您将极大地降低线程问题。请阅读“纯度”的概念,特别是关于原始概念的功能性编程。 – Quibblesome 2009-12-01 16:33:46

+0

http://en.wikipedia.org/wiki/Pure_function是纯度的前提。关于“纯”代码的最好的事情是没有竞争条件。关于“纯”代码最糟糕的是技术上它不能做任何有用的事情(技术上Console.WriteLine是不纯的)。但是这个概念值得赞赏,特别是在处理线程时。 – Quibblesome 2009-12-01 16:39:09

2

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