非同步操作--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/,如需轉載,請註明出處,否則將追究法律責任。
上一篇:
帶有命名方法的委託與帶有匿名方法的委託
請登入後發表評論
登入
全部評論
|
相關文章
- [轉載]使用BackgroundWorker元件進行非同步操作程式設計元件非同步程式設計
- C# BackgroundWorker 詳解C#
- Wpf BackgroundWorker WorkerSupportsCancellation CancellationPending
- Wpf BackgroundWorker WorkerReportsProgress ProgressChanged
- BurpSuite在非Web應用測試中的應用UIWeb
- Wpf BackgroundWorker DoWork RunWorkerCompleted RunWorkerAsyncKeras
- 非易失性NV-SRAM的應用
- JBoss的Web應用非/default/deploy/部署方式?Web
- Data Guard備庫日誌的實時應用與非實時應用
- 使用phpAnalysis打造PHP應用非侵入式效能分析器PHP
- C# socket 阻止模式與非阻止模式應用例項C#模式
- 應用加密1;非對稱加密演算法揭祕加密演算法
- 應用程式圖示更換器 (非明碼比較)
- javascript - 非同步操作JavaScript非同步
- 非同步操作(一)非同步
- 從同步原語看非阻塞同步以及Java中的應用Java
- 聊聊對稱/非對稱加密在HTTPS中的應用加密HTTP
- Dell PowerScale:從容應對四大非結構化資料典型應用
- win10怎麼將UWP應用安裝在非系統盤_win10將UWP應用安裝在非系統盤的步驟Win10
- JavaScript 非同步操作原理JavaScript非同步
- 非阻塞佇列ConcurrentLinkedQueue與CAS演算法應用分析佇列演算法
- 非Access資料庫在VB的程式設計及應用 (轉)資料庫程式設計
- 資料庫非同步操作資料庫非同步
- 微信小程式的同步操作微信小程式
- 如何讓nodejs同步操作NodeJS
- iOS內購非自動續期訂閱 應用內購買 IAP非自動續期訂閱 消耗型商品 非消耗型商品 流程...iOS
- 非侵入式無許可權應用內懸浮窗的實現
- Sensor Tower:2017年全球非手遊類應用收入榜
- 比特幣所有權及隱私問題-非對稱加密應用比特幣加密
- C++基礎::非型別模板引數在STL中的應用C++型別
- 在非k8s 環境下 的應用 使用 Dapr Sidekick for .NETK8SIDE
- IT職場:如何將TRIZ應用於非技術領域的創新問題?
- 【譯】async 的非同步操作模式非同步模式
- 非同步操作系列之Promise物件非同步Promise物件
- 可以中斷的非同步操作非同步
- 談談JavaScript非同步操作PromiseJavaScript非同步Promise
- Remoting之非同步操作模式REM非同步模式
- EXCEL | SUMIF函式應用之二:非空條件、排除錯誤值、日期區間求和應用Excel函式除錯