2011-09-30 99 views
2

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

我现在想让程序多线程化,因为用户体验在激烈的处理或I/O操作时非常糟糕。

什么是重构程序的最佳方式,以便它可以进行多线程,没有太多affort?我知道这是我应该思考的东西。但我没有。

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

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

如果不是,加载和解析300MB,创建对象大约需要3分钟才能完成。在这段时间内,用户从GUI没有得到任何回应。 :/

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

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

谢谢大家的所有建议。我会尝试他们。对于迟到的答复抱歉。

+1

在.NET简单的方法:你可以做你的处理BackgroundWorker的(S),所以UI线程可以自由地做他的生意。 – jv42

+0

PLINQ如何? – mironych

+0

你使用什么UI技术(WinForms,WPF,Web等)? –

回答

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。

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

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

+0

使用BackgroundWorker比创建自己的Thread更简单,并且具有为UI更新提供UI线程回调方法的好处。 – jv42

0

您可以使用TPL

您可以与TPL平行的循环,并且还更是内置在.NET 4.0,这样你就不必改变你的程序这么多

+0

当使用单身时,TPL并不是什么灵丹妙药。最难的部分是让它安全。 – jgauffin

+0

@jgauffin,但它可以帮助和有效地提高速度。 – 2011-09-30 13:48:17

+0

然后详细说明如何使用单例和TPL实现线程安全 – jgauffin

5

一般来说,我避免了单例模式,因为它在后面产生了很多问题,特别是在测试中。然而,如果你想要的是每个线程的单例,有一个相当简单的解决方案可以使这个工作适用于多线程。把你的单参考字段(不是属性),并与ThreadStaticAttribute装饰它:

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

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

+1

鉴于OP关于导入300MB数据的说法,这可能是内存消耗的问题。 –

+0

这很公平。这取决于你将拥有多少线程,以及如何在他们之间分配工作。即使每个线程都有整个数据集,但它看起来并不是一个不合理的内存消耗量(5个线程为1.5 GB)。 – dpurrington