效果

代码
public partial class Form1 : Form
{
CancellationTokenSource TokenSource;
CancellationToken cancellationToken;//退出线程用
ManualResetEvent m;//暂停线程用
public Form1()
{
InitializeComponent();
}
//更新UI
private void UpdataUIStatus(int step)
{
if (cancellationToken.IsCancellationRequested)//停止线程
{ return; }
m.WaitOne();//暂停线程
if (InvokeRequired)
{
this.Invoke(new Action<int>(delegate (int s)//匿名委托
{
this.progressBar1.Value += s;
this.label1.Text = this.progressBar1.Value.ToString() + "/" + this.progressBar1.Maximum.ToString();
}), step);
}
else
{
this.progressBar1.Value += step;
this.label1.Text = this.progressBar1.Value.ToString() + "/" + this.progressBar1.Maximum.ToString();
}
}
//完成任务时需要调用
private void Accomplish()
{
MessageBox.Show("任务完成");
}
private void button1_Click(object sender, EventArgs e)
{
int taskCount = 10000; //任务量为10000
this.progressBar1.Maximum = taskCount;
this.progressBar1.Value = 0;
DataWrite.UpdateUIDelegate += UpdataUIStatus;//前面的函数委托后面的函数执行
DataWrite.TaskCallBack += Accomplish;//前面的函数委托后面的函数执行
TokenSource = new CancellationTokenSource();
cancellationToken = TokenSource.Token;//退出线程用
m = new ManualResetEvent(true);//暂停线程用
Task.Run(() =>
{
this.Invoke(new Action(() => { btnstart.Enabled = false; }));
DataWrite.Write(taskCount);
},cancellationToken);
}
private void btnpause_Click(object sender, EventArgs e)
{
m.Reset();
}
private void btncontinu_Click(object sender, EventArgs e)
{
m.Set();
}
private void btnstop_Click(object sender, EventArgs e)
{
this.Invoke(new Action(() => { btnstart.Enabled = true; }));
TokenSource.Cancel();
UpdataUIStatus(0);
}
}
public static class DataWrite
{
public static Action<int> UpdateUIDelegate;//申明一个可以包裹1个int参数函数的委托
public static Action TaskCallBack;//申明一个可以包裹1个无返回函数的委托
public static void Write(object lineCount)
{
for (int i = 0; i < (int)lineCount; i++)
{
Thread.Sleep(100);
UpdateUIDelegate(1);
}
TaskCallBack();
}
}