我一直在試圖創建一個寫入數據庫而不阻塞UI線程的任務。我遇到的最大問題是等待該過程完成,而不發生阻塞。等待一個漫長的過程,仍然在更新UI
我一直在努力避免使用DoEvents
(雖然現在通過這個程序使用相當頻繁,但我希望在向前移動時不再使用它)。
我試圖創建進程在第二個線程上運行,並等待它完成以及使用BackgroundWorker
。
我有這個問題沒有代碼運行在不同的線程,但試圖找到一種方法來等待它完成。
基本上,現在我做到以下幾點:
- 連接到數據庫
- 創建一個後臺工作(或線程)的寫作做數據庫(我可能會結束與
BackgroundWorker
這樣我就可以使用ReportProgress
- 啓動線程或
BackgroundWorker
- 使用while循環來等待線程/
BackgroundWorker
完成。對於線程,我等待IsAlive
成爲假,對於BackgroundWorker
,我切換一個布爾變量。 - 我讓用戶知道該過程已完成。
問題出在#4。
否則沒有代碼while循環中,或放在Thread.Sleep(0)
離開封鎖了UI(Thread.Sleep(0)
使得程序走程序資源的100%爲好)
所以我做的:
while (!thread.IsAlive)
Thread.Sleep(1);
- 或 -
while (bProcessIsRunning)
Thread.Sleep(1);
其中阻止用戶界面。
如果我在那裏調用Application.DoEvents()
,UI會被更新(儘管它是可點擊的,所以我必須在此過程運行時禁用整個表單)。
如果我同步運行這個過程,我仍然需要創建某種方式來更新UI(在我的腦海中,調用DoEvents
),所以它不會被鎖定。
我在做什麼錯?
歡迎(因此)。一些小事情:1。請不要在「C#.NET(3.0)」之類的東西前加上標題。那是什麼標籤用於[所以]。 2.請不要簽名。 3.說到標籤,你應該通過添加適當的標籤告訴我們你是否使用winforms或wpf或其他。 –
對不起,我不知道該用什麼來標記它,用5個標籤帽,我沒有說。我正在使用Winforms(現在是一個標籤) –
@JohnSaunders:我強烈反對你的建議,不要在標題中包含標籤(例如C#.NET WinForms)。原因:Google是人們進入翻頁頁面最常用的方式。擁有包含這種背景的標題使得決定問答是否相關更爲迅速。 – ToolmakerSteve