非同步操作--BackgroundWorker應用
using System; using System.ComponentModel; using System.Threading; using System.Windows.Forms;
namespace BackgroundWorkerExample { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
//若要設定後臺操作,請為 DoWork 事件新增一個事件處理程式,此例中的 TimeConsumingOperation //在此事件處理程式中呼叫耗時的操作 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { // 必須非常小心,確保在 DoWork 事件處理程式中不操作任何使用者介面物件。ProgressChanged 和 //RunWorkerCompleted 事件與使用者介面進行通訊。 // 不要直接使用Form上的BackgroundWorker引用. // 而使用sender引數提供的引用. BackgroundWorker bw = sender as BackgroundWorker;
// 獲取 argument 屬性(object 表示非同步操作引數). int arg = (int) e.Argument;
// 為非同步操作結果獲取一個操作. e.Result = TimeConsumingOperation(bw, arg);
// 加入這個非同步操作被使用者取消, // 設定the DoWorkEventArgs.Cancel 為真. if (bw.CancellationPending) { e.Cancel = true; } }
//在操作完成時收到通知,對 RunWorkerCompleted 事件進行處理。 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) { // 使用者取消操作 MessageBox.Show("Operation was canceled"); } else if (e.Error != null) { // 操作期間發生一個錯誤 string msg = String.Format("An error occurred: {0}", e.Error.Message); MessageBox.Show(msg); } else { // 操作正常完成 string msg = String.Format("Result = {0}", e.Result); MessageBox.Show(msg); } }
// 這是一個可能花一段時間執行的操作 // 它能被取消,能丟擲一個異常, // 也能歸還一個結果. private int TimeConsumingOperation(BackgroundWorker bw, int sleepPeriod) { int result = 0; Random rand = new Random(); //獲取一個值,指示應用程式是否已經取消後臺操作 while (!backgroundWorker1.CancellationPending) { bool exit = false; switch (rand.Next(3)) { // 丟擲一個異常 case 0: { throw new Exception("An error condition occurred."); break; } case 1: { Thread.Sleep(sleepPeriod); break; } // 正常退出. case 2: { result = 23; exit = true; break; }
default: { break; } }
if (exit) { break; } }
return result; }
private void button1_Click(object sender, EventArgs e) { //啟動backgroundWorker1_DoWork中的事件處理程式,此例中的TimeConsumingOperation backgroundWorker1.RunWorkerAsync(2000); }
private void button2_Click(object sender, EventArgs e) { backgroundWorker1.CancelAsync(); }
private void Form1_Load(object sender, EventArgs e) { //元件支援取消操作 this.backgroundWorker1.WorkerSupportsCancellation = true; } } } //如果後臺操作需要引數,請在呼叫 RunWorkerAsync 時給出引數。在 DoWork 事件處理程式內部, //可以從 DoWorkEventArgs.Argument 來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-464305/,如需轉載,請註明出處,否則將追究法律責任。
上一篇:
帶有命名方法的委託與帶有匿名方法的委託
請登入後發表評論
登入
全部評論
|
相關文章
- Wpf BackgroundWorker WorkerSupportsCancellation CancellationPending
- Wpf BackgroundWorker WorkerReportsProgress ProgressChanged
- Wpf BackgroundWorker DoWork RunWorkerCompleted RunWorkerAsyncKeras
- BurpSuite在非Web應用測試中的應用UIWeb
- WPF Backgroundworker dowork work completed progress changed
- 非易失性NV-SRAM的應用
- Data Guard備庫日誌的實時應用與非實時應用
- C# - 非同步程式設計 - BackgroundWorker 類C#非同步程式設計
- javascript - 非同步操作JavaScript非同步
- 使用phpAnalysis打造PHP應用非侵入式效能分析器PHP
- 應用加密1;非對稱加密演算法揭祕加密演算法
- 非阻塞佇列ConcurrentLinkedQueue與CAS演算法應用分析佇列演算法
- 聊聊對稱/非對稱加密在HTTPS中的應用加密HTTP
- C# socket 阻止模式與非阻止模式應用例項C#模式
- JavaScript 非同步操作原理JavaScript非同步
- 從同步原語看非阻塞同步以及Java中的應用Java
- Dell PowerScale:從容應對四大非結構化資料典型應用
- win10怎麼將UWP應用安裝在非系統盤_win10將UWP應用安裝在非系統盤的步驟Win10
- 資料庫非同步操作資料庫非同步
- iOS內購非自動續期訂閱 應用內購買 IAP非自動續期訂閱 消耗型商品 非消耗型商品 流程...iOS
- 非侵入式無許可權應用內懸浮窗的實現
- 在非k8s 環境下 的應用 使用 Dapr Sidekick for .NETK8SIDE
- 非同步操作系列之Promise物件非同步Promise物件
- 【譯】async 的非同步操作模式非同步模式
- JavaScript async和await 非同步操作JavaScriptAI非同步
- 可以中斷的非同步操作非同步
- 基於Thinkphp5,Pjax,Ajax全站非同步操作自適應管理後臺PHP非同步
- 單頁應用SEO優化非Nodejs服務端渲染的處理方案優化NodeJS服務端
- 非啟用視窗(Inactive Window)
- 連續同源非同步操作佇列非同步佇列
- Javascript回撥非同步操作示例教程JavaScript非同步
- PHP實現非同步操作總結PHP非同步
- JS中的非同步操作總結JS非同步
- Sqlalchemy非同步操作不完全指北SQL非同步
- IT職場:如何將TRIZ應用於非技術領域的創新問題?
- 非易失性MRAM儲存器應用於各級快取記憶體快取記憶體
- 銀彈谷:SaaS在企業當中的應用並非一帆風順
- Sensor Tower:2023年全球移動應用(非遊戲)市場展望(附下載)遊戲
- react-native搭建用例(非CRNA)React