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 异步编程的研究
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//async 声明一个包含异步代码的函数,该函数执行时不会阻塞调用线程。sync里面的函数执行没遇到await前还是在主线程执行,遇到await就在异步子线程执行,不会阻塞继续往下执行
//async一般和await同时出现,也可以没有await,没有await就相当于主线程执行
//async标记的函数返回值必须为 void ,Task,Task<TResult>
//await 必须修饰Task 或者Task<TResult>
private void button1_Click(object sender, EventArgs e)
{
执行耗时方法();
Console.WriteLine("11111111");
//执行结果是先显示222222,然后显示1111,过来6秒,显示3333
//解释,函数执行耗时方法();进去后没有标记await的在主线程执行,所以或显示222222
//遇到await就是子线程执行,因为await后面用task这个子线程,于是不会阻塞主线程执行,但是会阻塞下面代码执行,然后回到
//主线程输出了1111111,干累活执行6秒异步返回了,所以会继续下面代码执行,输出了333333
}
public async void 执行耗时方法()
{
Console.WriteLine("2222222");
await Task.Run(() => 干累活());
Console.WriteLine("33333");
}
public async Task 干累活()
{
for (int i = 0; i < 6; i++)
{
await Task.Run(() =>
{
Thread.Sleep(1000);
});
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
Console.WriteLine("111");
执行耗时方法2();
Console.WriteLine("222");
//执行结果是先显示111,然后显示333,再显示222,过来6秒,显示over
//解释,函数执行耗时方法2();进去后先显示111,没有标记await的在主线程执行,所以显示333
//遇到await就是子线程执行,因为await后面用task这个子线程,于是不会阻塞主线程执行,但是会阻塞下面代码执行,然后回到
//主线程输出了222,干累活2执行6秒异步返回了,所以会继续下面代码执行,输出了333333
}
public async void 执行耗时方法2()
{
Console.WriteLine("333");
var result = await Task.Run(() => 干累活2());
Console.WriteLine(result);
}
public async Task<string> 干累活2()
{
for (int i = 0; i < 6; i++)
{
await Task.Run(() =>
{
Thread.Sleep(1000);
});
}
return "over";
}
}
}