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++;            }        }    }}