<1>:Async和Await的理解1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Async和Await的立即
{
class Program
{
static void Main(string[] args)
{
TestMain();
}
static void TestMain()
{
Console.Out.Write("Start\n"); //TestMain 方法启动
GetValueAsync();
Console.Out.Write("End\n"); //TestMain 方法结束
Console.ReadKey();
}
/// <summary>
/// 获取异步返回值
/// </summary>
/// <returns></returns>
static async Task GetValueAsync()
{
Console.WriteLine("Task Start");
//使用async修饰的方法称之为异步方法,在异步方法中,在await关键字的修改的语句之前的代码,会通知执行.
//await关键字修饰的语句会异步执行,await关键字并且会阻塞await关键字修饰的语句块之后的代码(在异步方法之中的代码),直到
//await修饰的异步方法执行完毕,才会执行await修饰的语句块后面的语句(在异步方法之中的语句.)
await Task.Run(() =>
{
Thread.Sleep(1000);
for (int i = 0; i < 5; ++i)
{
Console.Out.WriteLine(String.Format("From task : {0}", i));
}
});
Console.Out.WriteLine("Task End");
}
/*
* 对上面的代码,我们可以这样理解:当主线程中有耗时任务时,我们将它写到一个异步方法中(GetValueAsync)
* 在异步方法GetValueAsync中存在await关键字,在GetValueAsync方法中,在await关键字之前的代码,都是在主线程中同步执行的.
* 当程序知道到异步方法中的await修饰符修饰的语句块时,开启一个线程去执行被await修饰的语句块(使其异步),并立即退出GetvalueAsync方法
* 继续向下执行,而await修饰的语句块(一个方法,一般是开启一个线程执行耗时任务的方法)后面的代码,则等待await方法执行完成之后,之后执行
* 我们可以理解成(异步方法拿到返回值,之后执行的语句.)
*/
}
}
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading;
6
using System.Threading.Tasks;
7
8
namespace Async和Await的立即
9
{
10
class Program
11
{
12
static void Main(string[] args)
13
{
14
TestMain();
15
}
16
17
static void TestMain()
18
{
19
Console.Out.Write("Start\n"); //TestMain 方法启动
20
21
GetValueAsync();
22
23
Console.Out.Write("End\n"); //TestMain 方法结束
24
Console.ReadKey();
25
}
26
27
/// <summary>
28
/// 获取异步返回值
29
/// </summary>
30
/// <returns></returns>
31
static async Task GetValueAsync()
32
{
33
Console.WriteLine("Task Start");
34
35
//使用async修饰的方法称之为异步方法,在异步方法中,在await关键字的修改的语句之前的代码,会通知执行.
36
37
//await关键字修饰的语句会异步执行,await关键字并且会阻塞await关键字修饰的语句块之后的代码(在异步方法之中的代码),直到
38
39
//await修饰的异步方法执行完毕,才会执行await修饰的语句块后面的语句(在异步方法之中的语句.)
40
41
await Task.Run(() =>
42
{
43
Thread.Sleep(1000);
44
for (int i = 0; i < 5; ++i)
45
{
46
Console.Out.WriteLine(String.Format("From task : {0}", i));
47
}
48
});
49
50
Console.Out.WriteLine("Task End");
51
}
52
53
/*
54
* 对上面的代码,我们可以这样理解:当主线程中有耗时任务时,我们将它写到一个异步方法中(GetValueAsync)
55
* 在异步方法GetValueAsync中存在await关键字,在GetValueAsync方法中,在await关键字之前的代码,都是在主线程中同步执行的.
56
* 当程序知道到异步方法中的await修饰符修饰的语句块时,开启一个线程去执行被await修饰的语句块(使其异步),并立即退出GetvalueAsync方法
57
* 继续向下执行,而await修饰的语句块(一个方法,一般是开启一个线程执行耗时任务的方法)后面的代码,则等待await方法执行完成之后,之后执行
58
* 我们可以理解成(异步方法拿到返回值,之后执行的语句.)
59
*/
60
61
62
}
63
}
64
<2>:Async和Await的理解2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Async和Await的理解2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("主线程开始运行");
TestMain();
Console.WriteLine("主线程结束运行");
Console.ReadKey();
}
private static async void TestMain()
{
Console.WriteLine("等待耗时任务开始");
//获取异步之后的返回值,异步方法执行结束之后执行的业务逻辑
string asyncResult =await Fun(); //获取异步方法的返回值
Console.WriteLine("耗时任务执行完成,返回结果是{0}",asyncResult);
//进一步操作的业务逻辑
}
private static async Task<string> Fun()
{
Console.WriteLine("耗时任务开始");
string str = "10000000";
await Task.Run(() =>
{
bool b = true;
while (b)
{
if (Convert.ToInt32(str) != 0)
{
str = (Convert.ToInt32(str) - 1).ToString();
}
else
{
b = false;
}
}
Console.WriteLine("耗时任务结束");
});
return str;
}
}
}
73
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading;
6
using System.Threading.Tasks;
7
8
namespace Async和Await的理解2
9
{
10
class Program
11
{
12
static void Main(string[] args)
13
{
14
Console.WriteLine("主线程开始运行");
15
16
TestMain();
17
18
Console.WriteLine("主线程结束运行");
19
20
Console.ReadKey();
21
}
22
23
24
private static async void TestMain()
25
{
26
27
Console.WriteLine("等待耗时任务开始");
28
29
//获取异步之后的返回值,异步方法执行结束之后执行的业务逻辑
30
31
string asyncResult =await Fun(); //获取异步方法的返回值
32
33
Console.WriteLine("耗时任务执行完成,返回结果是{0}",asyncResult);
34
35
//进一步操作的业务逻辑
36
}
37
38
39
private static async Task<string> Fun()
40
{
41
Console.WriteLine("耗时任务开始");
42
43
string str = "10000000";
44
45
await Task.Run(() =>
46
{
47
48
bool b = true;
49
50
while (b)
51
{
52
if (Convert.ToInt32(str) != 0)
53
{
54
str = (Convert.ToInt32(str) - 1).ToString();
55
}
56
else
57
{
58
b = false;
59
}
60
}
61
62
63
Console.WriteLine("耗时任务结束");
64
65
66
});
67
68
return str;
69
}
70
71
}
72
}
73