c# - 使用单例多线程 C# 制作程序

标签 c# multithreading singleton

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

我现在想让程序多线程,因为在密集处理或 I/O 操作时,用户体验真的很差。

重构程序的最佳方法是什么,以便可以轻松地使其成为多线程的?我知道这是我之前应该想到的东西。但是我没有。

我将单例模式用于大约 3 个重要的模块,这些模块几乎涉及程序的所有其他功能。

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

如果没有,加载和解析 300MB,创建对象大约需要 3 分钟才能完成。在此期间,用户不会从 GUI 获得任何响应。 :/

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

第二个是让这个家伙对用户操作保持响应,或者至少避免出现窗口没有响应的警告。

谢谢大家的建议。我会试试的。抱歉回答晚了。

最佳答案

通常,我避免使用单例模式,因为它会在以后产生很多问题,尤其是在测试中。但是,如果您想要的是每个线程一个单例,那么有一个相当简单的解决方案可以使它适用于多个线程。将您的单例引用放在一个字段(而不是一个属性)中,并用 ThreadStaticAttribute 装饰它:

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

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

关于c# - 使用单例多线程 C# 制作程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7610881/

相关文章:

c# - 来自用户浏览器的网络请求

c# - 从另一个线程填充 ListView

c# - 一旦线程的功能范围结束,它是否会自行停止?

java - 如何解决 LI_LAZY_INIT_UPDATE_STATIC?

java - 我使用 Singleton 和 Realm Database 是否正确?

c++ - 在频繁引用的情况下替代单例

c# - 浮点运算以及x86和x64上下文

c# - 如何从服务器读取多个文件到c#

c# - EntityFramework GroupBy 与 DBFunctions 或替代

c# - 类设计质量