C# 异步方法调用
2013-04-07 16:27
197 查看
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#异步调用的好处和方法
- C#异步调用方法总结
- C#异步方法调用
- C#异步调用方法总结
- C#异步调用四大方法详解
- C#异步调用的好处和方法
- c#中两种常用的异步调用方法
- C# 异步实现方法调用
- .NET/C# 使用async和await关键字调用异步方法
- C#异步调用的好处和方法
- C# 异步编程 异步委托调用同步方法
- C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法
- C#的新特性体验(异步方法的同步调用)
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- C#构建多线程应用程序(1) —— 使用委托来自动创建次线程以实现异步方法的调用
- c# - async 异步 方法 怎么 调用
- C#的新特性体验(异步方法的同步调用)
- C#异步调用四大方法详解
- C#异步方法调用(四大方法详解)