文章編號:10879時間:2024-09-29人氣:
BackgroundWorker 是 .NET Framework 中的一種類,它允許您在后臺線程中執行長時間運行的任務,同時讓 UI 線程保持響應。這對于防止您的應用程序在執行耗時的操作時凍結非常有用。
要使用 BackgroundWorker,您需要執行以下步驟:
以下是一個使用 BackgroundWorker 的示例代碼:
```csharpusing System.ComponentModel;using System.Threading;public class MyForm : Form{private BackgroundWorker backgroundWorker;public MyForm(){backgroundWorker = new BackgroundWorker();backgroundWorker.DoWork += backgroundWorker_DoWork;backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;}private void button1_Click(object sender, EventArgs e){backgroundWorker.RunWorkerAsync();}private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e){// 在這里執行長時間運行的任務Thread.Sleep(5000);}private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){// 在這里執行任務完成后要執行的代碼}}```使用 BackgroundWorker 有幾個優點,包括:
使用 BackgroundWorker 也有幾個缺點,包括:
BackgroundWorker 是實現異步任務的 .NET 技術的有力工具。它可以幫助您防止 UI 線程凍結,提高應用程序性能,并且易于使用。但是,在使用 BackgroundWorker 時需要注意一些缺點,例如難以調試和可能導致死鎖。
用backgroundworker控件;在DoWork事件中BackgroundWorker worker = sender as BackgroundWorker;(當前進度條的量);在ProgressChanged事件中 = ;
在應用程序中,可能會遇到一些執行耗時的功能操作,比如數據下載、復雜計算及數據庫事務等,一般這樣的功能會在單獨的線程上實現,執行結束后結果顯示到用戶界面上,這樣可避免造成用戶界面長時間無響應情況。 在 2.0及以后的版本中,FCL提供了BackgroundWorker組件來方便的實現這些功能要求。 組件介紹BackgroundWorker類位于 命名空間中,通過該類在單獨的線程上執行操作實現基于事件的異步模式。 下面對BackgroundWorker類的主要成員進行介紹。 BackgroundWorker類的第1個主要方法是RunWorkerAsync,該方法提交一個以異步方式啟動運行操作的請求,發出請求后,將引發 DoWork 事件,在事件處理程序中開始執行異步操作代碼。 RunWorkerAsync 方法簽名如下,publicvoidRunWorkerAsync();publicvoidRunWorkerAsync(Object argument);如果異步操作需要操作參數,可以將其作為argument參數提供,由于參數類型為Object,因此訪問時可能需要進行類型轉換。 CancelAsync 方法提交終止異步操作的請求,并將 CancellationPending 屬性設置為 true。 需要注意的是,CancelAsync 方法是否調用成功,同WorkerSupportsCancellation 屬性相關,如果允許取消執行的異步操作,需將WorkerSupportsCancellation 屬性設置為true,否則調用該方法將拋出異常。 CancelAsync方法不含參數,方法簽名如下,publicvoid CancelAsync();調用 CancelAsync 方法時,BackgroundWorker的 CancellationPending 屬性值將被設置為true,因此在編寫單獨線程中執行的輔助方法時,代碼中應定期檢查 CancellationPending 屬性,查看是否已將該屬性設置為 true,如果為true,應該結束輔助方法的執行。 有一點需要注意的是,DoWork 事件處理程序中的代碼有可能在發出取消請求時已經完成處理工作,因此,DoWork事件處理程序或輔助方法可能會錯過設置CancellationPending屬性為true的時機。 在這種情況下,即使調用 CancelAsync方法發出了取消異步操作請求,RunWorkerCompleted 事件處理程序中RunWorkerCompletedEventArgs 參數的 Cancelled 標志也不會被設置為 true,這是在多線程編程中經常會出現的競爭條件問題,因此編寫代碼的時候需要考慮。 在執行異步操作時,如果需要跟蹤異步操作執行進度,BackgroundWorker類提供了 ReportProgress 方法,調用該方法將引發 ProgressChanged 事件,通過注冊該事件在事件處理程序中獲取異步執行進度信息。 方法簽名如下:publicvoidReportProgress(int percentProgress);publicvoidReportProgress(int percentProgress,Object userState);該方法包含兩個版本,percentProgress表示進度百分比,取值為0-100,userState為可選參數表示自定義用戶狀態。 同CancelAsync 方法一樣,BackgroundWorker的WorkerReportsProgress 屬性設置為 true時,ReportProgress 方法才會調用成功,否則將引發InvalidOperationException異常。 上面已經提到了BackgroundWorker的3個屬性,CancellationPending用來提示操作是否已經取消,WorkerReportsProgress和WorkerSupportsCancellation分別用來設置是否允許進度匯報和進行取消操作。 publicboolCancellationPending { get; }publicboolWorkerReportsProgress { get; set; }publicboolWorkerSupportsCancellation { get; set; }另外一個會用到的屬性是IsBusy,publicbool IsBusy { get; }通過該屬性查詢BackgroundWorker實例是否正在運行異步操作,如果 BackgroundWorker 正在運行異步操作,則為true,否則為false。 BackgroundWorker類包含3個事件,在事件處理程序中可進行異步操作輔助代碼編寫和同用戶界面信息交互。 publiceventDoWorkEventHandler DoWork;publiceventProgressChangedEventHandler ProgressChanged;publiceventRunWorkerCompletedEventHandler RunWorkerCompleted;DoWork事件處理程序用來調用輔助方法進行實際處理操作,由于該事件處理程序在不同于UI的線程上執行,因此需要確保在 DoWork 事件處理程序中不操作任何用戶界面對象。 如果輔助方法需要參數支持,可以通過RunWorkerAsync方法傳入,在 DoWork 事件處理程序中,通過 屬性提取該參數。 在異步操作期間,可以通過 ProgressChanged事件處理程序獲取異步操作進度信息,通過RunWorkerCompleted 事件處理程序獲取異步操作結果信息,在ProgressChanged和RunWorkerCompleted的事件處理程序中可以安全的同用戶界面進行通信。
1、這種情況下,多線程當然是要把最占用時間的步驟,以及循環的部分,放到線程里。
2、其他線程的代碼無法直接操作UI線程里的控件。 需要使用委托。
你具體的需求我不是很清楚。但是我在這里假設一個例子:
比如我有個買票的程序,必須每隔2秒,去服務器請求門票的剩余數量。 顯示在界面上。
界面上還有諸如“售票”“退票”之類的操作。界面如圖:
那么代碼可以這么寫:
如果是4.0以上,推薦用Task,如果是4.5以上,推薦async, await + Task。
終止BackgroundWorker,其實就是取消正在運行的后臺操作。 為此,執行以下步驟:1)首先要把屬性的值設置為true2)接著調用CancelAsync()方法3)檢查 屬性,判斷后臺異步操作是否被真正取消。 ======終止后臺操作之所以這么繁瑣,是因為后臺操作是以異步方式運行在后臺線程上的。
內容聲明:
1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://m.hudongshop.com/article/5bd578b551150484cb45.html,復制請保留版權鏈接!
歡迎來到本教程,我們將學習如何使用Eclipse來配置和管理SVN存儲庫,SVN,Subversion,是一個版本控制系統,它允許用戶跟蹤文件和目錄的變化,它是一種流行且功能強大的工具,可以幫助我們保持代碼庫的組織性和協作性,先決條件安裝EclipseIDE安裝Subversion客戶端,例如ApacheSubversion或Tort...。
本站公告 2024-09-27 23:38:48
在當今數字驅動的時代,技術的多元化融合正在塑造著我們的世界,從智能設備到云計算和人工智能,AI,,多種技術的融合正在創造新的機遇并改變著各個行業,工業互聯網解決方案,IIoT,尤其體現了這種融合趨勢,工業互聯網解決方案,技術的四重奏IIoT是一種集成技術,將物聯網,IoT,、云計算、大數據和人工智能融合在一起,這四項技術的協同作用實現...。
最新資訊 2024-09-26 23:19:52
文本框是用戶界面中常見的元素,允許用戶輸入和編輯文本,滾動條是文本框中可選的組件,它允許用戶在文本框的內容中上下滾動,滾動條對用戶體驗的影響滾動條對用戶體驗有以下影響,視覺混亂,當文本框包含大量文本時,滾動條會占用可用的屏幕空間,從而使文本更難閱讀,認知負荷,用戶必須了解如何使用滾動條才能在文本中導航,這會增加他們的認知負荷,導航困難...。
技術教程 2024-09-23 01:23:12
簡介ADOdb.Recordset是ADOdb庫中一個功能強大的類,用于處理數據庫記錄集,它提供了一套豐富的API,允許開發者輕松有效地操作記錄集,創建Recordset可以通過以下方法創建Recordset,使用prepare,方法創建SQL查詢語句,然后使用execute,方法執行查詢,使用,Execute,方法直接執行SQ...。
本站公告 2024-09-15 15:09:42
簡介在本文檔中,我們將探討如何使用Servlet、JSP和JSF來構建動態的JavaWeb應用,我們將從基礎開始,逐步介紹這些技術,并通過示例展示它們的實際應用,Servlet概述Servlet是一種Java類,用于處理來自Web客戶端的HTTP請求并生成動態響應,它們是JavaWeb開發的基礎,允許開發人員創建交互式Web應用,示例...。
最新資訊 2024-09-14 23:31:56
03cli>,Facebook,社交媒體巨頭使用ReactNative構建了其移動應用程序,Instagram,照片分享應用程序使用ReactNative重新設計了其界面,Airbnb,住宿預訂應用程序使用ReactNative提高了其性能和用戶體驗,掌握人生掌握ReactNative的高級特性可以幫助開發人員構建功能強大的移動應...。
最新資訊 2024-09-14 11:51:57
在現代軟件開發中,Web服務已成為一種集成不同系統和組件的關鍵技術,JavaEE作為一種成熟的企業級Java應用程序開發平臺,提供了豐富的功能來支持Web服務開發,并利用容器提供的強大功能來增強服務的可伸縮性、可靠性和可管理性,JavaEE中的Web服務開發JavaEE提供了全面的支持來開發和部署Web服務,包括以下核心組件,JAX,...。
互聯網資訊 2024-09-12 15:53:10
Java是一種功能強大的編程語言,非常適合游戲開發,憑借其廣泛的庫和框架,Java為開發者提供了創建高性能、跨平臺游戲的所需工具,認識Java游戲開發工具以下是Java游戲開發中必備的一些關鍵工具,LibGDX,一個開源的跨平臺游戲開發框架,支持Java、Kotlin和C,它提供了一套全面的API,用于創建2D和3D游戲,jMon...。
本站公告 2024-09-12 08:57:21
在當今競爭激烈的數字景觀中,網站設計已成為用戶體驗和網站成功至關重要的因素,隱藏式導航欄是一種創新的解決方案,它可以顯著提升網站的用戶體驗,同時增強其視覺吸引力,什么是隱藏式導航欄,隱藏式導航欄是一種導航元素,在頁面加載時默認處于隱藏狀態,當用戶將鼠標懸停在特定區域,例如頁面頂部或側邊,時,該導航欄才會出現,這種設計策略非常適合希望在...。
最新資訊 2024-09-11 21:23:23
定期更新軟件和操作系統至關重要,不僅可以確保數據安全,還能提供許多其他好處,例如提高性能、增加功能以及修復安全漏洞,定期更新軟件和操作系統保障數據安全軟件和操作系統更新通常包含針對已知安全漏洞的安全補丁,如果不安裝這些補丁,系統就會容易受到攻擊者利用的安全漏洞的攻擊,例如,2017年,WannaCry勒索軟件利用了MicrosoftW...。
互聯網資訊 2024-09-11 13:33:43
在網絡安全日益重要的時代,確保網站安全至關重要,惡意代碼攻擊是常見的網絡威脅,如果不及時采取措施,可能會對您的網站造成毀滅性后果,什么是JS壓縮工具,JS壓縮工具是一種可以縮小和優化JavaScript代碼的工具,通過移除不必要的空格、注釋和代碼變量,壓縮工具可以減少JS文件的大小,從而加快頁面加載速度和執行效率,JS壓縮工具如何防止...。
最新資訊 2024-09-09 22:25:41
body,font,family,Arial,Helvetica,sans,serif,font,size,16px,line,height,1.6em,h1,font,size,24px,font,weight,bold,h2,font,size,18px,font,weight,bold,h3,font,size,16px,...。
最新資訊 2024-09-05 21:17:43