C# 异步方法调用
来源:互联网 发布:网络系统渗透测试 编辑:程序博客网 时间:2024/04/30 03:13
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++; } } }}