日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WinForm:进度条的实现(异步)

發(fā)布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WinForm:进度条的实现(异步) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在WinForm中經常遇到一些費時的操作界面,比如統(tǒng)計某個磁盤分區(qū)的文件夾或者文件數(shù)目,如果分區(qū)很大或者文件過多的話,處理不好就會造成“假死”的情況,或者報“線程間操作無效”的異常,為了解決這個問題,可以使用委托來處理,在.net2.0中還可以用BackgroundWorker類。

BackgroundWorker類是.net 2.0里新增加的一個類,對于需要長時間操作而不需要用戶長時間等待的情況可以使用這個類。

注意確保在?DoWork?事件處理程序中不操作任何用戶界面對象。而應該過?ProgressChanged?和?RunWorkerCompleted?事件與用戶界面進行通信。

?它有幾個屬性:
CancellationPending——指示應用程序是否已請求取消后臺操作。
IsBusy——指示?BackgroundWorker?是否正在運行異步操作
WorkerReportsProgress——該值指示?BackgroundWorker?能否報告進度更新
WorkerSupportsCancellation——該值指示?BackgroundWorker?是否支持異步取消

還有如下事件:
DoWork——調用?RunWorkerAsync?時發(fā)生。
ProgressChanged——調用?ReportProgress?時發(fā)生。
RunWorkerCompleted——當后臺操作已完成、被取消或引發(fā)異常時發(fā)生。

還有如下方法:
CancelAsync——請求取消掛起的后臺操作
ReportProgress——引發(fā)?ProgressChanged?事件
RunWorkerAsync——開始執(zhí)行后臺操作

關于BackgroundWorker類更多詳細介紹可參考:http://blog.csdn.net/zhzuo/archive/2008/07/23/2699305.aspx

下載與本文相關的ProcessTest示例相關代碼。
http://files.cnblogs.com/Jason_z/ProcessTest.rar
程序運行界面


主要代碼如下:
?

using?System;
using?System.Collections.Generic;
using?System.ComponentModel;
using?System.Data;
using?System.Drawing;
using?System.Linq;
using?System.Text;
using?System.Windows.Forms;

namespace?ProcessTest
{
????
public?partial?class?Form1?:?Form
????{
????????
public?Form1()
????????{
????????????InitializeComponent();

????????????worker.WorkerReportsProgress?
=?true;

????????????worker.WorkerSupportsCancellation?
=?true;

????????????
//正式做事情的地方
????????????worker.DoWork+=new?DoWorkEventHandler(DoWork);

????????????
//任務完稱時要做的,比如提示等等
????????????worker.ProgressChanged?+=?new?ProgressChangedEventHandler(ProgessChanged);

????????????
//任務進行時,報告進度
????????????worker.RunWorkerCompleted?+=?new?RunWorkerCompletedEventHandler(CompleteWork);
????????}

????????
//調用?RunWorkerAsync?時發(fā)生
????????public?void?DoWork(object?sender,?DoWorkEventArgs?e)
????????{
????????????e.Result?
=?ComputeFibonacci(worker,?e);
????????????
//獲取異步操作結果的值,當ComputeFibonacci(worker,?e)返回時,異步過程結束
????????}

????????
//調用?ReportProgress?時發(fā)生
????????public?void?ProgessChanged(object?sender,?ProgressChangedEventArgs?e)
????????{
????????????
this.progressBar1.Value?=?e.ProgressPercentage;
????????????
//將異步任務進度的百分比賦給進度條
????????}

????????
//當后臺操作已完成、被取消或引發(fā)異常時發(fā)生
????????public?void?CompleteWork(object?sender,?RunWorkerCompletedEventArgs?e)
????????{
????????????MessageBox.Show(
"完成!");
????????}

????????
private?int?ComputeFibonacci(object?sender,?DoWorkEventArgs?e)
????????{
????????????
for?(int?i?=?0;?i?<?1000;?i++)
????????????{
????????????????
//判斷應用程序是否取消后臺操作
????????????????if(worker.CancellationPending)
????????????????{
????????????????????e.Cancel?
=?true;
????????????????}
????????????????
else
????????????????{
????????????????????worker.ReportProgress(i);
????????????????}

????????????????System.Threading.Thread.Sleep(
10);
????????????}
????????????
return?-1;
????????}

????????
private?void?btnStart_Click(object?sender,?EventArgs?e)
????????{
????????????worker.RunWorkerAsync();

????????????btnStart.Enabled?
=?false;

????????????btnPause.Enabled?
=?true;
????????}

????????
private?void?btnPause_Click(object?sender,?EventArgs?e)
????????{
????????????btnPause.Enabled?
=?false;

????????????btnStart.Enabled?
=?true;

????????????worker.CancelAsync();
????????}
????}
}

?

轉載于:https://www.cnblogs.com/Jason_z/archive/2009/10/15/1583669.html

總結

以上是生活随笔為你收集整理的WinForm:进度条的实现(异步)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。