2011-03-07 61 views
2

這可能相當複雜,所以對於羅嗦的問題感到抱歉。多線程程序設計注意事項

1)我現在要重新設計我的應用程序,以便與多個線程一起工作(背景工作人員準確。)我可能會有5或6個bgw的特定gui。我的第一個問題是,我有一個方法調用gui需要獲取其「核心」數據。然後將這些數據的各個部分用於各種對其他地方的調用,這些調用也形成與核心數據顯示在同一頁面上的數據。我如何處理這個與各種後臺工作人員,如backgroundworker1核心數據獲取,backgroundworker2使用核心的特定項目獲取更多的數據,backgroundworker3使用一些核心數據等?因此,我的gui和主線程處於解鎖狀態

2)正如我之前所說的,gui必須首先獲取一組核心數據,然後通過一些其他數據庫調用來獲取其餘重要數據。正如我所看到的,我需要在gui構造函數之外獲取這些數據,所以在創建gui時沒有這麼大的需求。在設計意義上,我應該如何構建我的GUI,以便它可以訪問那些只需要在創建時顯示的數據,然後才能訪問,訪問並顯示呢?

我希望這些不是太冗長的問題?我已經看到,很多這個歸結爲程序設計,作爲一個新手很難(當然在我看來)。希望有人能夠告訴我他們在這種情況下會做什麼。

謝謝

+2

你怎麼從去多線程的好處?正如你所描述的那樣,似乎你的軟件是**同步**和**順序**,即gui發送請求,等待響應,發送更多請求等等。多線程進入的位置在哪裏?你有多個客戶與數據服務器通話嗎?在某些情況下,多線程甚至可能會讓你放慢速度,因爲有鎖定的開銷。 – davka 2011-03-07 13:39:04

回答

1

這聽起來像是一個很好的工作隊列任務。這背後的主要想法是將一個工作項目添加到隊列中,並且此工作項目將具有關聯數據的功能。該工作通常分配給您指定的任意數量的線程。

其中幾個存在,只是谷歌它。

0

你看過.net 4任務並行庫嗎? Task Parallel Library
查看標題爲創建任務繼續的區域,幾乎在頁面的一半處。

這是一個例子形成鏈接網站

Task<byte[]> getData = new Task<byte[]>(() => GetFileData()); 
Task<double[]> analyzeData = getData.ContinueWith(x => Analyze(x.Result)); 
Task<string> reportData = analyzeData.ContinueWith(y => Summarize(y.Result)); 
getData.Start(); 

System.IO.File.WriteAllText(@"C:\reportFolder\report.txt", reportData.Result); 

//或...

Task<string> reportData2 = Task.Factory.StartNew(() => GetFileData()) 
             .ContinueWith((x) => Analyze(x.Result)) 
             .ContinueWith((y) => Summarize(y.Result)); 

System.IO.File.WriteAllText(@"C:\reportFolder\report.txt", reportData.Result);