1

我正在設計一個應用程序,它有可能在從服務器(無論是數據庫還是因特網)等待數據時掛起,問題是我不知道如何處理大量不同的地方可能需要時間。我應該在後臺線程中運行一切嗎?

我很高興在訪問正在發生時向用戶顯示「加載」對話框,但理想情況下,我不希望它彈出並在短期運行操作中消失。

微軟的話似乎很好地處理了這個問題,就好像你單擊一個按鈕並且操作需要很長時間,幾秒鐘後你會得到一個'working ..'對話框。該操作仍然是同步的,您不能中斷操作。但是,如果相同的操作很快發生,你顯然不會得到對話框。

我很高興(ish)設計出一些通用的後臺工作線程處理程序,並且我的數據處理的99%已經在靜態原子方法中完成了,但是如果可以的話,我希望能夠在這一方面進行最佳實踐。

如果任何人有模式,代碼或建議,我歡迎他們所有

乾杯

回答

1

微軟Word似乎很好地處理了這個問題,就好像你點擊一個按鈕並且操作需要很長時間,幾秒鐘後你會得到一個'working ..'對話框。該操作仍然是同步的,您不能中斷操作。但是,如果相同的操作很快發生,你顯然不會得到對話框。

如果是這種行爲你想......

你可以解決這個問題,很容易,通過圍繞BackgroundWorker的一類。就在DoWork事件開始的時候,以及第一次進度報告的時間。如果一段時間過去了,你可以顯示你的對話框 - 否則,阻止(因爲這是一個很短的過程)。這就是說,任何時候你正在做的工作可以異步處理,我建議這樣做。永遠不要在可見的時間間隔內阻止你的用戶界面,即使它很短,也會更好。通過使用task parallel library,這在.NET 4(或帶有Rx框架的3.5)中變得更加簡單。

+0

除了你有額外的線程開銷之外,這與我所說的有什麼不同? –

+0

@不退款不退貨:這裏沒有「額外線程的開銷」。差異在於方法。我給了他一個不同的選項,主線程中沒有定時器來處理這個問題。您的解決方案也需要單獨的線程,因爲異步方法調用是在單獨的線程上完成的。我還建議查看TPL中的任務進行異步處理。 –

+0

是的,但使用異步代碼,操作系統管理線程而不是你。你的方法對於開發者來說更​​多的工作,並且有更多的錯誤空間。 –

0

理想情況下,你應該運行任何IO或非UI處理無論是在後臺線程或異步避免鎖定UI 。

3

我肯定會認爲使用2個事件的模式是異步的。第一個「事件」是,您實際上從任何地方或任何時候都必須等待數據。第二個事件是延遲計時器。如果你在這個計時器彈出之前得到你的數據,一切都很好。如果沒有,那麼你彈出你的「我很忙」,並允許他們取消請求。當你最終得到迴應時,通常取消就意味着「忽略」。

相關問題