标签:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace asyncForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
///点击触发事件
this.btnstart.Click += new System.EventHandler(btnstart_Click);
}
public async void btnstart_Click(object sender, EventArgs e)
{
/// <summary>
/// 这里可以采用继承IProgress<T>接口的方式来实现 这里我采用lamda表达式实现的匿名委托来实现 这是实时状态返回时的回调
/// </summary>
IProgress<int> callBack = new Progress<int>(state =>
{
//设置进度条的进度啦
pbstate.Value = state;
btnstart.Text = state + "%";
});
this.btnstart.Text = await Task.Run(() =>
{
return bigWork(callBack);
});
}
/// <summary>
/// 这里加入一个做艰难工作的异步方法
/// </summary>
/// <returns></returns>
private string bigWork(IProgress<int> callBack)
{
Random rn = new Random();
for (int i = 1; i < 11; i++)
{
Thread.Sleep(rn.Next(10) * 1000);
callBack.Report(i * 10);
}
return "Hello";
}
}
}
Net的异步任务处理步骤如下:
1. 将一个高耗时耗资源的操作放在一个普通方法中
2. 实现一个实现IProgress<T>接口的对象,其中T为在实时回调过程中回传的数据 ,我们大多来用作状态信息,在回调的Report方法中加入对于当前状态的响应代码,如进度条的改变等等。
申明一个异步方法或者事件(使用async关键字),利用
await Task.Run(() =>
{
return bigWork(callBack);
});
3. 来执行大量耗时的操作。如果你需要得到异步方法的返回值可以使用
this.btnstart.Text = await Task.Run(() =>
{
return bigWork(callBack);
});
来得到返回值。
标签:
原文地址:http://www.cnblogs.com/chengfeifei/p/5322361.html