2013-04-01 71 views
3

這可能是一個非常普遍的問題 - 但我對C#很陌生。 你能否向我解釋一下,或給我一個例子或解釋的好鏈接。如何在C#WinForms應用程序中設計工作流程?

我想設計一個C#Winform應用程序。 應用程序有一個主窗體,在需要時收集用戶輸入。 與UI一起,開發了一個複雜的長時間運行計算算法。 計算開始由主窗體上的一個按鈕觸發。 (CaculateClass.Start())

問題1: 在時間深處CaculateClass的方法調用堆棧的某一點的CaculateClass檢測出它需要來自用戶的進一步輸入,繼續計算。

在古代C++控制檯應用程序中,人們可能會這樣做: cout < <「Ask question」; cin >>回答;

這是如何在C#中使用winforms完成的,要將控制權從調用堆棧中的某個位置傳遞到UI,獲取輸入並返回到計算被中斷的位置? 或者CaculateClass被設計成完全不同的?

問題2 爲了避免UI凍結,很多文章推薦將這種長時間運行的計算放入另一個線程中 - 例如,通過使用BackgroundWorker()

如果我讓CaculateClass.Start()由BackgroundWorker計算 - >收集用戶輸入如何工作?

感謝您的幫助, CS

回答

4

這是如何在C#中做與的WinForms,從深層的某處控制傳遞給UI調用堆棧,獲取輸入並返回到計算中所中斷的地方嗎?或者CaculateClass被設計成完全不同的?

它可能不是特定語言,但你想分離的東西。從表單獲取輸入,例如在委託類中執行。一旦你的委託類已準備好並有結果顯示,你就更新你的UI。

問題2爲了避免UI凍結很多文章建議把這樣長時間運行的計算到另一個話題 - 例如通過使用BackgroundWorker的()

至於響應,是一個後臺線程會工作得很好那裏。收集輸入並沒有什麼不同,只需將輸入傳遞給一個對象,然後該對象就會爲你計算一些東西。這是在同一個線程或不同線程上進行設計選擇的問題。發佈結果返回主線程時會有所不同。由於您不應該(不能)在主線程之外的其他線程上更改您的用戶控件,因此您需要將結果返回主線程。更多關於this topic can be found on MSDN

上一個一般性的問題總體意見:)

儘量保持UI的東西儘可能薄。它負責可視化事物並獲取用戶輸入。 Google for MVC(模型視圖控制器) - 一個衆所周知的GUI設計模式。或者看看MVVM(模型視圖模型) - 一種更現代的GUI設計模式。兩者都有很多最佳實踐和方法來保持設計的分離。

相關問題