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

时间:2011-09-30 13:13:26

标签: c# multithreading singleton

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

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

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

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

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

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

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

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

谢谢大家的所有建议。我会试试看。对于已故的回答感到抱歉。

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

您可以使用TPL

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

相关问题