2011-09-30 97 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