用单例多线程c#编写程序

本文关键字:程序 单例 多线程 | 更新日期: 2023-09-27 18:10:03

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

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

重构程序的最好方法是什么,这样它就可以不费太多的力气就变成多线程的?我知道我早该想到这些。但我没有。

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

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

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

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

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

谢谢大家的建议。我要尝尝。很抱歉回复晚了。

用单例多线程c#编写程序

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

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

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

最简单的方法是将所有计算移到一个单独的线程中,并使用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。

应用程序是线程安全的,只要你不允许用户在运行的计算过程中进行更改。

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

您可以使用TPL

你可以让循环与TPL并行,而且它是内置在。net 4.0,所以你不必改变你的程序那么多