2013-05-15 42 views
1

我目前有一個啓動中央邏輯類(使用其他一些.dll來檢查硬件或連接到數據庫)的項目。之後,一個WPF表單被啓動。這種形式使用中央邏輯的信息。線程或線程池中的不同實例?

目前,該應用程序正在啓動這樣的:

public void StartTheWholeBunch() 
{ 
    Thread thread = new Thread(() => 
    { 
     applicationLogic = new ApplicationLogic(); 
     Application app = new Application(); 
     app.Run(new MainWindow(applicationLogic)); 
    }); 
    thread.IsBackground = true; 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
    thread.Join(); 
} 

的主窗口是我想用兩個WPF應用程序之一。所以第二個人會加入後期的樂趣。

當前設置正在工作。一切都是相互溝通的,而且這裏沒有問題。我只是想知道是否使用這個Thread是正確的。當我離開線程applicationLogic = new ApplicationLogic();時,事情肯定會出錯(例如創建MessageBox彈出窗口,整個應用程序將在此凍結)。

我應該把所有東西放在一個線程中嗎?或者更好的做法是將所有東西分開或創建一個Threadpool?我怎樣才能以最好的方式來解決問題?

+4

提示:如果你啓動一個線程,並立即加入它,它幾乎可以肯定你並不需要一個單獨的線程。線程的關鍵點是能夠(至少在概念上)一次完成兩件獨立的事情,而當你等待'Join()'返回時,你有點失敗。 – cHao

+0

@cHao應用程序邏輯應該運行不確定。我想這意味着我應該保留在這個線程中。我使用'Join',因爲它會以某種方式關閉,否則...... – Joetjah

+0

它可能會被關閉,因爲後臺線程不會讓程序保持活動狀態。 (我甚至沒有意識到你可以'加入()'它們,但是呃)。只要任何*非*背景線程正在運行,應用程序就會一直存在。 – cHao

回答

0

applicationLogic應該無限期地運行。

我認爲你正在混合一個全局存在的類實例和線程的需要。你不需要一個單獨的線程,你只需要ApplicationLogic是一個Singleton。

public class ApplicationLogic 
{ 
    private static ApplicationLogic _instance = new ApplicationLogic(); 
    public static ApplicationLogic Instance { get { return _instance; } } 

    private ApplicationLogic() { } 
} 

此外,通過執行即時thread.Join();,你正在做的Thread一個有爭議的問題。你不需要這個線程,只需啓動主窗體。所以現在

var otherForm = new OtherForm(); 
otherForm.Show(); 

而且我們正在ApplicationLogic一個Singleton,這是你與其他線程在做什麼(:如果你想加載另一種形式,只要做到這一點,創建一個新的實例並顯示它那種),你可以訪問它像這樣:

ApplicationLogic.Instance.DoSomething(); 
+0

我就是這樣開始的。但是當我嘗試運行這個時,我得到錯誤'調用線程必須是STA,因爲許多UI組件需要這個。'當通過MainWindow newForm = new MainWindow(applicationLogic);'創建窗體時'。這就是爲什麼我圍繞它創建了一個線程。 – Joetjah

+0

當我不使用任何線程時,該消息就會發給我,但只是啓動主窗體。但是我對此不甚瞭解,所以我可能會搞砸了。 – Joetjah

+0

大寫字母Singleton在這裏可能會矯枉過正......它誘使代碼說'ApplicationLogic.Instance'而不是使用它給出的對象。 superapp可以將ApplicationLogic保留爲私有字段,並根據需要將其傳遞給「MainWindow」構造函數。 – cHao