C#--耗時操作實現UI界面實時更新不阻塞(耗時操作解決窗體卡頓)
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
前言C#實現窗體加載進度條或者百分比實時顯示耗時操作的進度,方法有很多。但是經過我的學習、查找與實際應用,發現Task配合MethodInvoker最為高效便捷。下面我就來結合代碼講一下要注意的問題。 基礎知識C#在winform上進行耗時操作往往會放置progressbar,問題是在UI線程上進行耗時操作就會導致UI線程阻塞,界面就會卡頓。所以勢必要另開一個線程進行耗時操作,之后將耗時操作的過程實時反饋給UI線程即可,可問題是新開的線程向UI線程傳遞數據的時候,就會出現經典報錯: InvalidOperationException,并提示消息:“從不是創建控件的線程訪問它。 這是因為NET原則上禁止跨線程訪問。因為這樣可能造成錯誤的發生,有一種簡單粗暴的方法是禁止編譯器對跨線程訪問作檢查,Control.CheckForIllegalCrossThreadCalls = false;可以實現訪問,但是什么時候出錯不敢保證。 TaskTask是一個升級版本的Thread的類,它非常的靈活,支持取消、阻塞等待、合并、多個Task協同操作......。總之使用Task編碼高效易懂,你基本不用去研究Thread與ThreadPool了,雖然本質上還是這個。我個人理解Task就是對Thread的再次封裝。 MethodInvokerMethodInvoker 是位于System.Windows.Forms下的元數據,表示一個委托,該委托可以執行托管代碼中聲明為void且不接受任何參數的任何方法。在對控件的 invoke 方法進行調用時或需要一個簡單委托又不想自己定義時可以使用該委托。 我是這樣理解的,在新線程中使用 MethodInvoker 委托執行耗時操作, 其實相當于是在主線程中執行的,這樣就避免了跨線程訪問控件。 示例代碼
線程的延續采用ContinueWith解決 BeginInvoke解決界面的刷新問題 TaskScheduler.FromCurrentSynchronizationContext() 解決跨線程訪問報錯
button2的方式可以在task線程中按順序執行耗時操作。 該文章在 2024/11/27 18:53:32 編輯過 |
關鍵字查詢
相關文章
正在查詢... |