C# 多线程应用程序的策略 我可能继承了一个有点复杂的多线程应用程序,它目前有几个具有2 +K LOC的文件,从全局访问的许多全局变量和其他我认为很臭的实践。

C# 多线程应用程序的策略 我可能继承了一个有点复杂的多线程应用程序,它目前有几个具有2 +K LOC的文件,从全局访问的许多全局变量和其他我认为很臭的实践。,c#,multithreading,refactoring,synchronization,C#,Multithreading,Refactoring,Synchronization,在我开始使用当前模式添加新功能之前,我想尝试一下,看看是否可以改进应用程序的基本架构。下面是一个简短的描述: 应用程序在内存中有数据列表、列表A、列表B 应用程序具有数据的本地副本(用于脱机功能)dataFileA、dataFileB 应用程序有线程tA1、tB1,它们将脏数据从客户端更新到服务器 线程tA2、tB2将脏数据从服务器更新到客户端 线程tA3、tB3将内存列表中的脏数据更新为本地文件 我有点麻烦什么不同的模式,策略,编程实践等,我应该研究,以便有知识,作出最佳决策在这方面 以下

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

  • 应用程序在内存中有数据列表、列表A、列表B
  • 应用程序具有数据的本地副本(用于脱机功能)dataFileA、dataFileB
  • 应用程序有线程tA1、tB1,它们将脏数据从客户端更新到服务器
  • 线程tA2、tB2将脏数据从服务器更新到客户端
  • 线程tA3、tB3将内存列表中的脏数据更新为本地文件
我有点麻烦什么不同的模式,策略,编程实践等,我应该研究,以便有知识,作出最佳决策在这方面

以下是我为自己制定的一些目标:

  • 让应用程序尽可能保持稳定
  • 让Generic Intern可以轻松添加新功能(每个新的EditRecordX.cs中都有多达50行的样板代码)
  • 降低复杂性

  • 感谢您提供的任何关键字或其他提示可以帮助我完成此项目。

    我想您应该看看以下内容:

    这篇博文:

    这是:


    希望有帮助。

    我想你应该看看这个:

    这篇博文:

    这是:


    希望有帮助。

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

    如果您可以将tA2、tB2、tA3和tB3合并到相同的线程中以杀死一些线程,那么可能值得一看。如果这是不可能的,考虑把它们放在幕墙后面(一个线程,它关注UI和与服务器交谈的服务之间的移动数据请求)。这使得“面向用户”的代码只需要处理一个客户端,而不是两个客户端。(我不将备份计算为客户端,因为这听起来像是一个单向过程)


    如果线程(UI和facade)彼此等待完成请求,那么这将防止“拉更新”与“推更新”同时发生.

    我建议另一个目标是删除/减少全局状态,并尽可能经常地在堆栈上保留信息,以减少出现争用条件和奇怪线程问题的可能性

    如果您可以将tA2、tB2、tA3和tB3合并到相同的线程中以杀死一些线程,那么可能值得一看。如果这是不可能的,考虑把它们放在幕墙后面(一个线程,它关注UI和与服务器交谈的服务之间的移动数据请求)。这使得“面向用户”的代码只需要处理一个客户端,而不是两个客户端。(我不将备份计算为客户端,因为这听起来像是一个单向过程)


    如果线程(UI和facade)彼此等待完成请求,那么这应该可以防止“推送更新”与“推送更新”同时发生。

    一般来说,要进行此类更改,您需要查看Martin Fowler的(大部分已打开)和。您还可能发现在支持安全更改方面很有用。所有这些对于多线程处理都没有那么大的帮助,除了在多线程环境中更简单的代码更容易处理。

    要进行此类更改,您通常需要查看Martin Fowler的(大部分已打开)以及。您还可能发现在支持安全更改方面很有用。所有这些对于多线程来说都没有那么大的帮助,除了在多线程环境中更简单的代码更容易处理。

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

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

    感谢您的评论。我会检查这些,但目前我被困在2.0宇宙中,所以vs2010和4.0中可能出现的解决方案几乎超出了我的能力范围。谢谢你的评论。我会检查这些,但目前我被困在2.0宇宙中,所以vs2010和4.0中可能出现的解决方案几乎超出了我的能力范围。“尽可能多地删除/减少全局状态并在堆栈中保留信息”您能否对此进行澄清,我不确定你说的堆栈是什么意思?我说的堆栈是指传递到当前方法中的参数。这是堆栈顶部的内容。如果您删除全局状态,而是找到方法将相关信息作为参数传递(甚至可能是深度复制,以避免对线程a上的引用执行操作以更改线程B正在处理的数据),那么将大大降低线程问题的可能性。阅读“纯度”的概念,尤其是关于原始概念的函数式编程。是纯洁的前提。“纯”代码最好的地方是没有竞争条件。“纯”代码最糟糕的一点是,从技术上讲,它不能做任何有用的事情(从技术上讲,Console.WriteLine是不纯的)。但是这个概念值得欣赏,特别是在处理线程时。“删除/减少全局状态并尽可能经常地在堆栈上保留信息”您能否对此进行澄清,我不确定您所说的堆栈是什么意思?所谓堆栈,我指的是传递到当前方法中的参数。这是堆栈顶部的内容。如果您删除全局状态,而不是找到方法