使用单例multithreadingC#制作程序

我用C#编写了一个程序。 现在我完成了所有function,它的工作原理。 但只能用一个线程运行。 我正在进行大量计算,有时会将大约300 MB或更多的测量文件加载到应用程序中。

我现在想要使程序multithreading,因为在强烈处理或i / o操作时用户体验非常糟糕。

重构程序的最佳方法是什么,以便可以在没有太多附加的情况下制作multithreading? 我知道这是我之前想要的东西。 但我没有。

我使用单例模式来处理大约3个重要的模块,这些模块几乎涉及程序的所有其他function。

我使用了或多或少干净的MVC(模型视图控制)架构。 所以我想知道是否有可能让用户界面在一个线程中运行而另一个应用程序在另一个线程中运行。

如果没有,加载和解析300MB,创建对象大约需要3分钟才能完成。 在这个时候,用户没有得到GUI的响应。 :/

更新:我的单身人士被用作一种存储。 一个单例保存解析的测量文件的对象,而另一个单例保存结果。 我有不同的计算,它使用相同的测量文件并创建他们想要使用其他单例保存的结果。 这是一个问题。

第二个是让人员对用户操作做出响应,或者至少避免窗口没有响应的警告。

谢谢大家的所有建议。 我会试试看。 对不起,我很抱歉。

最简单的方法是将所有计算移动到一个单独的线程,并使用Invoke / InvokeRequired更新GUI。

 public partial class MyForm : Form { Thread _workerThread; public MyForm() { _workerThread = new Thread(Calculate); } public void StartCalc() { _workerThread.Start(); } public void Calculate() { //call singleton here } // true if user are allowed to change calc settings public bool CanUpdateSettings { get { return !_workerThread.IsAlive; } } } } 

通过这种方式,您可以在计算运行时获得响应GUI。

只要您不允许用户在运行计算期间进行更改,应用程序就是线程安全的。

使用多个线程进行计算是一个更复杂的故事,我们需要更多信息来为您提供正确的答案。

一般来说,我避免使用单例模式,因为它会在未来产生很多问题,特别是在测试中。 但是,如果您想要的是每个线程的单例,那么有一个相当简单的解决方案可以使这个工作用于多个线程。 将您的单例引用放在字段(不是属性)中并使用ThreadStaticAttribute进行装饰:

 public class MySingleton { [ThreadStatic] private static MySingletonClass _instance = new MySingletonClass(); public static MySingletonClass Instance { get { return _instance; } } } 

现在每个线程都有自己的MySingleton实例。

您可以使用TPL

您可以使用TPL并行创建循环,并且使用.NET 4.0内置循环,这样您就不必更改程序了