using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication5 {
public partial class Form1 : Form {
Progress <int> progress;
CancellationTokenSource cts=null;
public Form1() {
InitializeComponent();
progress = new Progress<int>();
progress.ProgressChanged += Progress_ProgressChanged;
}
//进度变化触发事件
private void Progress_ProgressChanged(object sender, int e) {
progressBar1.Value = e;
}
//采用async异步操作, 所以UI不会出现卡顿
private async void button1_Click(object sender, EventArgs e) {
if (cts==null)
progressBar1.Value = await DoWork((cts=new CancellationTokenSource()).Token ,progress);//传入取消标记以及进度
}
//async 异步操作
private async Task<int> DoWork(CancellationToken token, IProgress<int> progress=null) {
int result=0;
for (int i=0; i<=100; i++) {
result = i;
await Task.Delay(TimeSpan.FromSeconds(0.2));
if (progress != null) {
progress.Report(i); //触发进度更变事件-->Progress_ProgressChanged
}
if (token.IsCancellationRequested) { //如果取消操作
progress.Report(0); //清零
return 0; //返回零
}
}
return result;
}
private void button2_Click(object sender, EventArgs e) {
cts.Cancel(); //取消操作
progressBar1.Value = 0;
cts = null;
}
}
}
async 异步进度条,防UI卡顿
最新推荐文章于 2024-07-02 10:00:16 发布