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;
using System.Threading;
namespace AsyncControl
{
public partial class Form1 : Form
{
private delegate void AsyncEventHandle();
public Form1()
{
InitializeComponent();
}
/*
了解BackgroundWorker的使用
1)两个属性:
WorkerReportsProgress: 是否报告进度更新
WorkerSupportsCancellation: 是否支持异步取消
2)三个事件:
DoWork: 包含执行代码或对执行代码的调用.
ProgressChanged: 改变进度条.
RunWorkerCompleted: 给出提示信息,显示是否被取消,执行成功还是失败.
*/
BackgroundWorker work = null;
AsyncEventHandle EventHandle = null;
int i;
private void btnStart_Click(object sender, EventArgs e)
{
//*********BackgroundWorker的异步调用
//if (work==null)
//{
// i = 1;
// work = new BackgroundWorker();
// work.WorkerReportsProgress = true;
// work.WorkerSupportsCancellation = true;
// work.DoWork += new DoWorkEventHandler(work_DoWork);
// work.ProgressChanged += new ProgressChangedEventHandler(work_ProgressChanged);
// work.RunWorkerCompleted += new RunWorkerCompletedEventHandler(work_RunWorkerCompleted);
// work.RunWorkerAsync();
//}
//*******委托的异步调用
EventHandle=new AsyncEventHandle(Method);
IAsyncResult result = EventHandle.BeginInvoke(new AsyncCallback(CallbackMethod), EventHandle);
}
private void Method()
{
this.Invoke(new MethodInvoker(delegate
{
while (i <= progressBar1.Maximum)
{
if (i == progressBar1.Maximum)
{
break;
}
Application.DoEvents();
progressBar1.Value = i;
i++;
Thread.Sleep(500);
}
}));
}
void CallbackMethod(IAsyncResult ar)
{
//((AsyncEventHandle)ar.AsyncState).EndInvoke(ar);
AsyncEventHandle obj = (AsyncEventHandle)ar.AsyncState;
//this.Invoke(new MethodInvoker(delegate
//{
// while (i <= progressBar1.Maximum)
// {
// Application.DoEvents();
// progressBar1.Value = i;
// i++;
// Thread.Sleep(500);
// }
//}));
}
void work_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = i;
}
void work_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
MessageBox.Show("Cancelled");
else
if (e.Error != null)
MessageBox.Show("Error");
else
MessageBox.Show("Finished");
}
void work_DoWork(object sender, DoWorkEventArgs e)
{
//this.Invoke(new MethodInvoker(delegate {
// while (i <= progressBar1.Maximum)
// {
// Application.DoEvents();
// progressBar1.Value = i;
// i++;
// Thread.Sleep(500);
// }
//}));
//this.Invoke(new MethodInvoker(() =>
//{
// while (i <= progressBar1.Maximum)
// {
// Application.DoEvents();
// progressBar1.Value = i;
// i++;
// Thread.Sleep(500);
// }
//}
//));
while (i <= progressBar1.Maximum)
{
if (i == progressBar1.Maximum)
{
break;
}
if (work.CancellationPending)
{
e.Cancel = true;
break;
}
Thread.Sleep(500);
work.ReportProgress(i);
i++;
}
}
}
}
C# 异步方法调用
最新推荐文章于 2022-09-06 15:20:43 发布