您的位置:首页 > 编程语言 > C#

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++;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: