威尼斯人线上娱乐

剖析异步方法,异步编制程序

18 4月 , 2019  

走进异步编制程序的世界 – 剖析异步方法(上)

走进异步编制程序的世界 – 剖析异步方法(上)

一、简介

[C#] 异步编制程序,

  那是上篇《走进异步编制程序的世界 – 起初接触 async/await
异步编制程序》(入门)的第一章内容,主假若与我们壹道深入研讨下异步方法。

  本文须要领会委托的行使。

 

  那是上篇《走进异步编制程序的世界 – 开始接触 async/await
异步编制程序》(入门)的第1章内容,重若是与大家齐声长远探究下异步方法。

  本文须求理解委托的应用。

 

  首先来看看.net的前进中的各种阶段的性状:NET 与C#
的各类版本发布都以有贰个“大旨”。即:C#一.0托管代码→C#2.0泛型→C#3.0LINQ→C#四.0动态语言→C#4.5异步编程

分析异步方法

目录

  • 介绍异步方法

  • 控制流

  • await
    表达式

  • How
    撤废异步操作

 

目录

  • 介绍异步方法

  • 控制流

  • await
    表达式

  • How
    打消异步操作

 

 

  这是上篇《伊始接触 async/await
异步编制程序》(入门)的第三章内容,主假使深深通晓异步方法,提出大家先看入门篇,异常的短。

  本文要求理解委托的采纳。

 

介绍异步方法

     异步方法:在实行到位前及时重返调用方法,在调用方法继续施行的历程中完成任务。

     语法分析:

     (一)关键字:方法头使用 async
修饰。

     (2)供给:包涵N(N>0) 个 await 表明式(不设有 await 表明式的话 IDE
会发出警示),表示要求异步实行的职务。【备注】感激 czcz1024 的纠正与增加补充:未有的话,就和普通方法同样实行了。

     (三)重回类型:只可以回到 3种档次(void、Task 和 Task<T>)。Task 和 Task<T>
标记重临的靶子会在后天达成工作,表示调用方法和异步方法能够继续实行。

     (四)参数:数量不限。但无法选择 out
和 ref 关键字。

     (5)命名约定:方法后缀名应以 Async
结尾。

     (六)其余:匿名格局和 Lambda
表明式也足以看作异步对象;async 是一个上下文关键字;关键字 async
必须在回来类型前。

 

威尼斯人线上娱乐 1图一异步方法的简短结构图

  关于 async 关键字:

  壹在回去类型之前包蕴 async 关键字

  贰它只是标志该办法包涵3个或多少个 await
表达式,即,它自己不创设异步操作。

  三它是上下文关键字,即可作为变量名。

 

  现在先来回顾分析一下这两种回到值类型:void、Task 和 Task<T>

  (一)Task<T>:调用方法要从调用中得到1个T 类型的值,异步方法的回到类型就非得是Task<T>。调用方法从 Task 的
Result 属性获取的正是 T 类型的值。

威尼斯人线上娱乐 2威尼斯人线上娱乐 3

 1         private static void Main(string[] args)
 2         {
 3             Task<int> t = Calculator.AddAsync(1, 2);
 4 
 5             //一直在干活
 6 
 7             Console.WriteLine($"result: {t.Result}");
 8 
 9             Console.Read();
10         }

Program.cs

威尼斯人线上娱乐 4威尼斯人线上娱乐 5

 1     internal class Calculator
 2     {
 3         private static int Add(int n, int m)
 4         {
 5             return n + m;
 6         }
 7 
 8         public static async Task<int> AddAsync(int n, int m)
 9         {
10             int val = await Task.Run(() => Add(n, m));
11 
12             return val;
13         }
14     }

View Code 

威尼斯人线上娱乐 6

图2

威尼斯人线上娱乐 7

图3

 

  (2)Task:调用方法不供给从异步方法中取重返值,可是期望检查异步方法的情事,那么能够接纳能够返回Task 类型的对象。然则,固然异步方法中隐含 return
语句,也不会回去任何事物。

威尼斯人线上娱乐 8威尼斯人线上娱乐 9

 1         private static void Main(string[] args)
 2         {
 3             Task t = Calculator.AddAsync(1, 2);
 4 
 5             //一直在干活
 6 
 7             t.Wait();
 8             Console.WriteLine("AddAsync 方法执行完成");
 9 
10             Console.Read();
11         }

Program.cs

威尼斯人线上娱乐 10威尼斯人线上娱乐 11

 1     internal class Calculator
 2     {
 3         private static int Add(int n, int m)
 4         {
 5             return n + m;
 6         }
 7 
 8         public static async Task AddAsync(int n, int m)
 9         {
10             int val = await Task.Run(() => Add(n, m));
11             Console.WriteLine($"Result: {val}");
12         }
13     }

View Code

 

威尼斯人线上娱乐 12

 

图4

威尼斯人线上娱乐 13

图5

     

  (三)void:调用方法施行异步方法,但又不须求做特别的互动。 

威尼斯人线上娱乐 14威尼斯人线上娱乐 15

 1         private static void Main(string[] args)
 2         {
 3             Calculator.AddAsync(1, 2);
 4 
 5             //一直在干活
 6 
 7             Thread.Sleep(1000); //挂起1秒钟
 8             Console.WriteLine("AddAsync 方法执行完成");
 9 
10             Console.Read();
11         }

Program.cs

威尼斯人线上娱乐 16威尼斯人线上娱乐 17

 1     internal class Calculator
 2     {
 3         private static int Add(int n, int m)
 4         {
 5             return n + m;
 6         }
 7 
 8         public static async void AddAsync(int n, int m)
 9         {
10             int val = await Task.Run(() => Add(n, m));
11             Console.WriteLine($"Result: {val}");
12         }
13     }

Calculator.cs

威尼斯人线上娱乐 18

图6

威尼斯人线上娱乐 19

图7

 

介绍异步方法

     异步方法:在实践到位前及时重返调用方法,在调用方法继续试行的历程中成就职责。

     语法分析:

     (一)关键字:方法头使用 async
修饰。

     (二)要求:包涵N(N>0) 个 await 表明式(不存在 await 表明式的话 IDE
会发出警示),表示须要异步实行的职责。【备注】多谢 czcz1024 的匡正与互补:未有的话,就和普通方法同样进行了。

     (三)再次来到类型:只好回到 三种档次(void、Task 和 Task<T>)。Task 和 Task<T>
标志重返的目的会在未来到位工作,表示调用方法和异步方法可以继续推行。

     (肆)参数:数量不限。但无法利用 out
和 ref 关键字。

     (5)命名约定:方法后缀名应以 Async
结尾。

     (陆)别的:匿名方式和 拉姆da
表明式也得以看成异步对象;async 是1个上下文关键字;关键字 async
必须在回来类型前。

 

威尼斯人线上娱乐 20图1 异步方法的简约结构图

  关于 async 关键字:

  一在回来类型在此之前包括 async 关键字

  贰它只是标志该办法包罗1个或多少个 await
表明式,即,它自身不创制异步操作。

  叁它是上下文关键字,就可以作为变量名。

 

  以后先来轻易分析一下这两种回到值类型:void、Task 和 Task<T>

  (一)Task<T>:调用方法要从调用中获取二个T 类型的值,异步方法的回来类型就非得是Task<T>。调用方法从 Task 的
Result 属性获取的就是 T 类型的值。

威尼斯人线上娱乐 21威尼斯人线上娱乐 22

 1         private static void Main(string[] args)
 2         {
 3             Task<int> t = Calculator.AddAsync(1, 2);
 4 
 5             //一直在干活
 6 
 7             Console.WriteLine($"result: {t.Result}");
 8 
 9             Console.Read();
10         }

Program.cs

威尼斯人线上娱乐 23威尼斯人线上娱乐 24

 1     internal class Calculator
 2     {
 3         private static int Add(int n, int m)
 4         {
 5             return n + m;
 6         }
 7 
 8         public static async Task<int> AddAsync(int n, int m)
 9         {
10             int val = await Task.Run(() => Add(n, m));
11 
12             return val;
13         }
14     }

View Code 

威尼斯人线上娱乐 25

图2

威尼斯人线上娱乐 26

图3

 

  (2)Task:调用方法不需求从异步方法中取再次回到值,但是希望检查异步方法的情况,那么能够选用能够回来
Task 类型的靶子。可是,纵然异步方法中富含 return
语句,也不会回去任何事物。

威尼斯人线上娱乐 27威尼斯人线上娱乐 28

 1         private static void Main(string[] args)
 2         {
 3             Task t = Calculator.AddAsync(1, 2);
 4 
 5             //一直在干活
 6 
 7             t.Wait();
 8             Console.WriteLine("AddAsync 方法执行完成");
 9 
10             Console.Read();
11         }

Program.cs

威尼斯人线上娱乐 29威尼斯人线上娱乐 30

 1     internal class Calculator
 2     {
 3         private static int Add(int n, int m)
 4         {
 5             return n + m;
 6         }
 7 
 8         public static async Task AddAsync(int n, int m)
 9         {
10             int val = await Task.Run(() => Add(n, m));
11             Console.WriteLine($"Result: {val}");
12         }
13     }

View Code

 

威尼斯人线上娱乐 31

 

图4

威尼斯人线上娱乐 32

图5

     

  (3)void:调用方法推行异步方法,但又不供给做进一步的相互。 

威尼斯人线上娱乐 33威尼斯人线上娱乐 34

 1         private static void Main(string[] args)
 2         {
 3             Calculator.AddAsync(1, 2);
 4 
 5             //一直在干活
 6 
 7             Thread.Sleep(1000); //挂起1秒钟
 8             Console.WriteLine("AddAsync 方法执行完成");
 9 
10             Console.Read();
11         }

Program.cs

威尼斯人线上娱乐 35威尼斯人线上娱乐 36

 1     internal class Calculator
 2     {
 3         private static int Add(int n, int m)
 4         {
 5             return n + m;
 6         }
 7 
 8         public static async void AddAsync(int n, int m)
 9         {
10             int val = await Task.Run(() => Add(n, m));
11             Console.WriteLine($"Result: {val}");
12         }
13     }

Calculator.cs

威尼斯人线上娱乐 37

图6

威尼斯人线上娱乐 38

图7

 

  上边我来归纳的牵线一下异步编制程序:异步编制程序,在 .NET Framework 四.伍 和
Windows 运维时采用异步扶助。
编写翻译器可实行开拓人士曾开展的高难度职业,且应用程序保留了三个接近于同台代码的逻辑结构。
因此,你只需做一小部分职业就足以收获异步编制程序的装有好处。 

目录

 

一、控制流

     异步方法的组织可拆分成多少个例外的区域:

     (一)表明式以前的一对:从点子头到第一个await 表明式之间的持有代码。

剖析异步方法,异步编制程序。     (贰)await
表明式:将被异步推行的代码。

     (三)表明式之后的一部分:await
表明式的一连部分。

 威尼斯人线上娱乐 39

  图1-1

 

  该异步方法实施流程:从await表达式以前的地点初步,同步实行到第三个await,标记着第一部分进行达成,1般的话此时 await 工作还没成功。当await
义务成功后,该措施将一而再联合推行后续部分。在实行的连续部分中,假诺仍旧存在
await,就再一次上述进度。

  当到达 await
表明式时,线程将从异步方法重返到调用方法。假若异步方法的回来类型为 Task
或 Task<T>,会创立贰个 Task 对象,标识须求异步完毕的职务,然后将
Task 重返来调用方法。

 

威尼斯人线上娱乐 40

  图1-2

  异步方法的调节流:

  一异步实行 await 表明式的闲暇职责。

  二await 表明式施行到位,继续施行后续部分。如再蒙受 await
表达式,按一样情形实行拍卖。

  三达到末尾或遭遇 return 语句时,依据重临类型能够分二种景况:

    a.void:退出调整流。

    b.Task:设置
Task 的习性并退出。

    c.Task<T>:设置 Task
的品质和重返值(Result 属性)并脱离。

  四同时,调用方法将继续实践,从异步方法获得 Task
对象。须求值的时候,会暂停等到 Task 对象的 Result
属性被赋值才会继续施行。

 

  【难点】

  一先是次相见 await
所再次来到对象的花色。那一个重返类型便是1道方法头的回到类型,跟 await
表明式的重临值未有关联。

  二达到异步方法的最后或遭受 return
语句,它并不曾真正的回来2个值,而是退出了该情势。

 

一、控制流

     异步方法的构造可拆分成三个例外的区域:

     (一)表明式此前的1部分:从事艺术工作术头到第一个await 表明式之间的具有代码。

     (贰)await
表达式:将被异步试行的代码。

     (三)表达式之后的片段:await
表明式的继续部分。

 威尼斯人线上娱乐 41

  图1-1

 

  该异步方法试行流程:从await表明式在此以前的地点开头,同步施行到第1个await,标记着第一有个别进行完结,壹般的话此时 await 工作还没到位。当await
职责完毕后,该办法将承袭一同推行后续部分。在推行的一而再部分中,假诺照旧留存
await,就再也上述进度。

  当到达 await
表明式时,线程将从异步方法重回到调用方法。若是异步方法的归来类型为 Task
或 Task<T>,会成立贰个 Task 对象,标志须求异步完毕的职责,然后将
Task 重返来调用方法。

 

威尼斯人线上娱乐 42

  图1-2

  异步方法的调整流:

  ①异步实施 await 表达式的悠闲职务。

  2await 说明式实践到位,继续施行后续部分。如再遭逢 await
表明式,按同样情状进行拍卖。

  三达到末尾或遭受 return 语句时,依照重临类型可以分两种状态:

    a.void:退出调控流。

    b.Task:设置
Task 的天性并脱离。

    c.Task<T>:设置 Task
的习性和重回值(Result 属性)并脱离。

  四还要,调用方法将继续实践,从异步方法获得 Task
对象。须要值的时候,会停顿等到 Task 对象的 Result
属性被赋值才会继续试行。

 

  【难点】

  壹先是次相遇 await
所重返对象的品种。那些重回类型就是一同方法头的回来类型,跟 await
表达式的再次来到值未有关系。

  2达到异步方法的最后或蒙受 return
语句,它并未当真的回来贰个值,而是退出了该措施。

 

 

介绍异步方法

   
 异步方法:在实践到位前及时再次回到调用方法,在调用方法继续施行的经过中达成职务。
     语法分析:      (壹)关键字:方法头使用 async 修饰。    
 (二)供给:包涵 N(N>0) 个 await 表明式(不存在 await 表明式的话
IDE
会发出警示),表示必要异步试行的任务。【备注】感激 czcz1024 的纠正与补偿:未有的话,就和常常方法同样举行了。
     (3)重返类型:只好回到 三 种档次(void、Task 和
Task<T>)。Task 和 Task<T>
标志重临的靶子会在前天产生工作,表示调用方法和异步方法能够继续推行。    
 (4)参数:数量不限。但不能够应用 out 和 ref 关键字。    
 (伍)命名约定:方法后缀名应以 Async 结尾。      (6)别的:匿名格局和
拉姆da 表明式也得以看作异步对象;async 是叁个上下文关键字;关键字 async
必须在回去类型前。     关于 async 关键字:

  1在再次回到类型从前蕴含 async 关键字

  贰它只是标记该格局包罗一个或四个 await
表明式,即,它本身不创制异步操作。

  三它是上下文关键字,就可以作为变量名。

 

  以往先来重点分析一下那三种回到值类型:void、Task 和 Task<T>

  (一)Task<T>:调用方法要从调用中获得二个 T
类型的值,异步方法的回到类型就不能不是Task<T>。调用方法从 Task 的
Result 属性获取的便是 T 类型的值。

威尼斯人线上娱乐 43 1 private
static void Main(string[] args) 二 { 三 Task<int> t =
Calculator.AddAsync(1, 贰); 四 5 //一贯在工作 陆 7Console.WriteLine($”result: {t.Result}”); 八 9 Console.Read(); 10 } Program.cs
威尼斯人线上娱乐 44 1 internal
class Calculator 2 { 3 private static int Add(int n, int m) 4 { 5 return
n + m; 6 } 7 8 public static async Task<int> AddAsync(int n, int
m) 9 { 10 int val = await Task.Run(() => Add(n, m)); 11 12 return
val; 13 } 14 } View Code 

 

  (二)Task:调用方法不须要从异步方法中取再次来到值,可是希望检查异步方法的地方,那么能够选取可以回去
Task 类型的目的。但是,即便异步方法中涵盖 return
语句,也不会再次回到任何事物。

威尼斯人线上娱乐 45 1 private
static void Main(string[] args) 2 { 三 Task t = Calculator.AddAsync(1,
二); 4 伍 //向来在做事 6 7 t.Wait(); 八 Console.WriteLine(“AddAsync
方法试行到位”); 9 10 Console.Read(); 1一 } Program.cs
威尼斯人线上娱乐 46 1 internal
class Calculator 2 { 3 private static int Add(int n, int m) 4 { 5 return
n + m; 6 } 7 8 public static async Task AddAsync(int n, int m) 9 { 10
int val = await Task.Run(() => Add(n, m)); 11
Console.WriteLine($”Result: {val}”); 12 } 13 } View Code

威尼斯人线上娱乐 47

图4

威尼斯人线上娱乐 48

图5

     

  (叁)void:调用方法实行异步方法,但又不要求做尤其的相互。 

威尼斯人线上娱乐 49 1 private
static void Main(string[] args) 2 { 三 Calculator.AddAsync(一, 二); 4 5
//一向在劳作 6 7 Thread.Sleep(1000); //挂起1分钟 八Console.WriteLine(“AddAsync 方法推行到位”); 九 10 Console.Read(); 1一 }
Program.cs
威尼斯人线上娱乐 50 1 internal
class Calculator 2 { 3 private static int Add(int n, int m) 4 { 5 return
n + m; 6 } 7 8 public static async void AddAsync(int n, int m) 9 { 10
int val = await Task.Run(() => Add(n, m)); 11
Console.WriteLine($”Result: {val}”); 12 } 13 } Calculator.cs

威尼斯人线上娱乐 51

图6

威尼斯人线上娱乐 52

图7

 

二、await 表达式

  await 表达式钦点了三个异步推行的职务。默许情形,该职务在近日线程异步实践。

  每1个任务即是1个 awaitable 类的实例。awaitable 类型指包含GetAwaiter() 方法的花色。

  实际上,你并不供给营造友好的 awaitable,一般只要求接纳 Task
类,它就是 awaitable。

  最简易的主意是在措施中行使
Task.Run() 来成立2个 Task。【注意】它是在不一样的线程上推行方式。

 

  让我们一齐来看望示例。

威尼斯人线上娱乐 53威尼斯人线上娱乐 54

 1     internal class Program
 2     {
 3         private static void Main(string[] args)
 4         {
 5             var t = Do.GetGuidAsync();
 6             t.Wait();
 7 
 8             Console.Read();
 9         }
10 
11 
12         private class Do
13         {
14             /// <summary>
15             /// 获取 Guid
16             /// </summary>
17             /// <returns></returns>
18             private static Guid GetGuid()   //与Func<Guid> 兼容
19             {
20                 return Guid.NewGuid();
21             }
22 
23             /// <summary>
24             /// 异步获取 Guid
25             /// </summary>
26             /// <returns></returns>
27             public static async Task GetGuidAsync()
28             {
29                 var myFunc = new Func<Guid>(GetGuid);
30                 var t1 = await Task.Run(myFunc);
31 
32                 var t2 = await Task.Run(new Func<Guid>(GetGuid));
33 
34                 var t3 = await Task.Run(() => GetGuid());
35 
36                 var t4 = await Task.Run(() => Guid.NewGuid());
37 
38                 Console.WriteLine($"t1: {t1}");
39                 Console.WriteLine($"t2: {t2}");
40                 Console.WriteLine($"t3: {t3}");
41                 Console.WriteLine($"t4: {t4}");
42             }
43         }
44     }

View Code

威尼斯人线上娱乐 55

图2-1

威尼斯人线上娱乐 56

图2-2

   上面 四 个 Task.Run() 都以使用了 Task Run(Func<TReturn> func)
方式来平昔或直接调用 Guid.NewGuid()。

 

  Task.Run() 援救 四 中不一样的信托项目所代表的艺术:Action、Func<TResult>、Func<Task>
和 Func<Task<TResult>>

威尼斯人线上娱乐 57威尼斯人线上娱乐 58

 1     internal class Program
 2     {
 3         private static void Main(string[] args)
 4         {
 5             var t = Do.GetGuidAsync();
 6             t.Wait();
 7 
 8             Console.Read();
 9         }
10 
11         private class Do
12         {
13             public static async Task GetGuidAsync()
14             {
15                 await Task.Run(() => { Console.WriteLine(Guid.NewGuid()); });   //Action
16 
17                 Console.WriteLine(await Task.Run(() => Guid.NewGuid()));    //Func<TResult>
18 
19                 await Task.Run(() => Task.Run(() => { Console.WriteLine(Guid.NewGuid()); }));   //Func<Task>
20 
21                 Console.WriteLine(await Task.Run(() => Task.Run(() => Guid.NewGuid())));    //Func<Task<TResult>>
22             }
23         }
24     }

View Code

威尼斯人线上娱乐 59

图二-三 Task.Run() 方法的重载

 

二、await 表达式

  await 表明式钦命了1个异步实践的天职。私下认可意况,该职责在当下线程异步奉行。

  每1个职务正是2个 awaitable 类的实例。awaitable 类型指包涵GetAwaiter() 方法的品种。

  实际上,你并不需求营造和谐的 awaitable,1般只须求利用 Task
类,它就是 awaitable。

  最简便易行的法门是在措施中接纳Task.Run() 来创建叁个 Task。【注意】它是在差异的线程上实践措施。

 

  让我们一齐来看看示例。

威尼斯人线上娱乐 60威尼斯人线上娱乐 61

 1     internal class Program
 2     {
 3         private static void Main(string[] args)
 4         {
 5             var t = Do.GetGuidAsync();
 6             t.Wait();
 7 
 8             Console.Read();
 9         }
10 
11 
12         private class Do
13         {
14             /// <summary>
15             /// 获取 Guid
16             /// </summary>
17             /// <returns></returns>
18             private static Guid GetGuid()   //与Func<Guid> 兼容
19             {
20                 return Guid.NewGuid();
21             }
22 
23             /// <summary>
24             /// 异步获取 Guid
25             /// </summary>
26             /// <returns></returns>
27             public static async Task GetGuidAsync()
28             {
29                 var myFunc = new Func<Guid>(GetGuid);
30                 var t1 = await Task.Run(myFunc);
31 
32                 var t2 = await Task.Run(new Func<Guid>(GetGuid));
33 
34                 var t3 = await Task.Run(() => GetGuid());
35 
36                 var t4 = await Task.Run(() => Guid.NewGuid());
37 
38                 Console.WriteLine($"t1: {t1}");
39                 Console.WriteLine($"t2: {t2}");
40                 Console.WriteLine($"t3: {t3}");
41                 Console.WriteLine($"t4: {t4}");
42             }
43         }
44     }

View Code

威尼斯人线上娱乐 62

图2-1

威尼斯人线上娱乐 63

图2-2

   上面 肆 个 Task.Run() 都以使用了 Task Run(Func<TReturn> func)
方式来直接或直接调用 Guid.NewGuid()。

 

  Task.Run() 协理 四 中分裂的嘱托项目所代表的不二秘籍:Action、Func<TResult>、Func<Task>
和 Func<Task<TResult>>

威尼斯人线上娱乐 64威尼斯人线上娱乐 65

 1     internal class Program
 2     {
 3         private static void Main(string[] args)
 4         {
 5             var t = Do.GetGuidAsync();
 6             t.Wait();
 7 
 8             Console.Read();
 9         }
10 
11         private class Do
12         {
13             public static async Task GetGuidAsync()
14             {
15                 await Task.Run(() => { Console.WriteLine(Guid.NewGuid()); });   //Action
16 
17                 Console.WriteLine(await Task.Run(() => Guid.NewGuid()));    //Func<TResult>
18 
19                 await Task.Run(() => Task.Run(() => { Console.WriteLine(Guid.NewGuid()); }));   //Func<Task>
20 
21                 Console.WriteLine(await Task.Run(() => Task.Run(() => Guid.NewGuid())));    //Func<Task<TResult>>
22             }
23         }
24     }

View Code

威尼斯人线上娱乐 66

图二-3 Task.Run() 方法的重载

 

  所谓的异步编制程序是应用CPU空闲时间和多核的特点,它所再次来到的Task或Task<TResult>是对await的三个答应,当任务奉行达成后归来二个结实给接收者。那里看看那些恐怕各位不太驾驭,无妨,上面会有疏解。

一、控制流

     异步方法的构造可拆分成三个差异的区域:    
 (一)表明式在此以前的有的:从章程头到第2个 await 表达式之间的兼具代码。  
   (2)await 表明式:将被异步实践的代码。    
 (三)表明式之后的一部分:await 表明式的存在延续部分。   一 internal class
Program 二 { 三 private static void Main(string[] args) 4 { 5 var t =
Do.GetGuidAsync(); 陆 t.Wait(); 7 捌 Console.Read(); 玖 } 拾 11 1二 private
class Do 13 { 14 /// <summary> 1伍 /// 获取 Guid 1陆 ///
</summary> 一七 /// <returns></returns> 1八 private
static Guid GetGuid() //与Func<Guid> 包容 1玖 { 20 return
Guid.NewGuid(); 二一 } 2二 2叁 /// <summary> 二四 /// 异步获取 Guid 25
/// </summary> 2六 /// <returns></returns> 贰⑦ public
static async Task GetGuidAsync() 2捌 { 2九 var myFunc = new
Func<Guid>(GetGuid); 30 var t1 = await Task.Run(myFunc); 31 3二 var
t2 = await Task.Run(new Func<Guid>(GetGuid)); 3三 3四 var t三 = await
Task.Run(() => GetGuid()); 35 3陆 var t四 = await Task.Run(() =>
Guid.NewGuid()); 三七 38 Console.WriteLine($”t一: {t1}”); 39Console.WriteLine($”t2: {t贰}”); 40 Console.WriteLine($”t三: {t三}”); 41Console.WriteLine($”t四: {t四}”); 4二 } 肆叁 } 44 } View Code

图2-1

图2-2

   上边 四 个 Task.Run() 都以行使了 Task Run(Func<TReturn> func)
情势。

 

  Task.Run() 补助 四中差别的委托项目所表示的格局:Action、Func<TResult>、Func<Task>
和 Func<Task<TResult>>

威尼斯人线上娱乐 67 1 internal
class Program 2 { 3 private static void Main(string[] args) 4 { 5 var
t = Do.GetGuidAsync(); 6 t.Wait(); 7 8 Console.Read(); 9 } 10 11 private
class Do 12 { 13 public static async Task GetGuidAsync() 14 { 15 await
Task.Run(() => { Console.WriteLine(Guid.NewGuid()); }); //Action 16
17 Console.WriteLine(await Task.Run(() => Guid.NewGuid()));
//Func<TResult> 18 19 await Task.Run(() => Task.Run(() => {
Console.WriteLine(Guid.NewGuid()); })); //Func<Task> 20 21
Console.WriteLine(await Task.Run(() => Task.Run(() =>
Guid.NewGuid()))); //Func<Task<TResult>> 22 } 23 } 24 }
View Code

 

3、How 撤消异步操作

   CancellationToken 和 CancellationTokenSource
那多少个类允许你打住实行异步方法。

  (一)CancellationToken
对象涵盖职分是或不是被撤回的新闻;若是该目的的习性 IsCancellationRequested

true,职务需终止操作并赶回;该对象操作是不可逆的,且不得不动用(修改)3回,即该对象内的 IsCancellationRequested
属性被安装后,就不可能退换。

  (二)CancellationTokenSource 可成立 CancellationToken
对象,调用 CancellationTokenSource 对象的 Cancel
方法,会使该对象的 CancellationToken 属性 IsCancellationRequested 设置为
true。

  【注意】调用 CancellationTokenSource
对象的 Cancel
方法,并不会实行撤废操作,而是会将该对象的 CancellationToken
属性 IsCancellationRequested 设置为 true。

 

  示例

威尼斯人线上娱乐 68威尼斯人线上娱乐 69

 1     internal class Program
 2     {
 3         private static void Main(string[] args)
 4         {
 5             CancellationTokenSource source = new CancellationTokenSource();
 6             CancellationToken token = source.Token;
 7 
 8             var t = Do.ExecuteAsync(token);
 9 
10             //Thread.Sleep(3000);   //挂起 3 秒
11             //source.Cancel();    //传达取消请求
12 
13             t.Wait(token);  //等待任务执行完成
14             Console.WriteLine($"{nameof(token.IsCancellationRequested)}: {token.IsCancellationRequested}");
15 
16             Console.Read();
17         }
18 
19 
20     }
21 
22     internal class Do
23     {
24         /// <summary>
25         /// 异步执行
26         /// </summary>
27         /// <param name="token"></param>
28         /// <returns></returns>
29         public static async Task ExecuteAsync(CancellationToken token)
30         {
31             if (token.IsCancellationRequested)
32             {
33                 return;
34             }
35 
36             await Task.Run(() => CircleOutput(token), token);
37         }
38 
39         /// <summary>
40         /// 循环输出
41         /// </summary>
42         /// <param name="token"></param>
43         private static void CircleOutput(CancellationToken token)
44         {
45             Console.WriteLine($"{nameof(CircleOutput)} 方法开始调用:");
46 
47             const int num = 5;
48             for (var i = 0; i < num; i++)
49             {
50                 if (token.IsCancellationRequested)  //监控 CancellationToken
51                 {
52                     return;
53                 }
54 
55                 Console.WriteLine($"{i + 1}/{num} 完成");
56                 Thread.Sleep(1000);
57             }
58         }
59     }

View Code

威尼斯人线上娱乐 70

图3-1

威尼斯人线上娱乐 71

图3-二 注释两行代码

威尼斯人线上娱乐 72

图叁-叁:图三-1和图3-二的实行结果(注释两行代码)

  上海体育地方是不调用 Cancel() 方法的结果图,不会撤废任务的推行。

 

  下图在 叁 秒后调用 Cancel() 方法裁撤职分的实践:

威尼斯人线上娱乐 73

图三-四:去掉注释

威尼斯人线上娱乐 74

图三-5:图三-壹和图三-四的施行结果(去掉注释)

 

3、How 撤消异步操作

   CancellationToken 和 CancellationTokenSource
那多个类允许你打住推行异步方法。

  (1)CancellationToken
对象涵盖职分是不是被收回的音信;假若该指标的质量 IsCancellationRequested

true,任务需终止操作并赶回;该目的操作是不可逆的,且不得不利用(修改)3遍,即该对象内的 IsCancellationRequested
属性被安装后,就无法改造。

  (二)CancellationTokenSource 可创设 CancellationToken
对象,调用 CancellationTokenSource 对象的 Cancel
方法,会使该对象的 CancellationToken 属性 IsCancellationRequested 设置为
true。

  【注意】调用 CancellationTokenSource
对象的 Cancel
方法,并不会实践裁撤操作,而是会将该对象的 CancellationToken
属性 IsCancellationRequested 设置为 true。

 

  示例

威尼斯人线上娱乐 75威尼斯人线上娱乐 76

 1     internal class Program
 2     {
 3         private static void Main(string[] args)
 4         {
 5             CancellationTokenSource source = new CancellationTokenSource();
 6             CancellationToken token = source.Token;
 7 
 8             var t = Do.ExecuteAsync(token);
 9 
10             //Thread.Sleep(3000);   //挂起 3 秒
11             //source.Cancel();    //传达取消请求
12 
13             t.Wait(token);  //等待任务执行完成
14             Console.WriteLine($"{nameof(token.IsCancellationRequested)}: {token.IsCancellationRequested}");
15 
16             Console.Read();
17         }
18 
19 
20     }
21 
22     internal class Do
23     {
24         /// <summary>
25         /// 异步执行
26         /// </summary>
27         /// <param name="token"></param>
28         /// <returns></returns>
29         public static async Task ExecuteAsync(CancellationToken token)
30         {
31             if (token.IsCancellationRequested)
32             {
33                 return;
34             }
35 
36             await Task.Run(() => CircleOutput(token), token);
37         }
38 
39         /// <summary>
40         /// 循环输出
41         /// </summary>
42         /// <param name="token"></param>
43         private static void CircleOutput(CancellationToken token)
44         {
45             Console.WriteLine($"{nameof(CircleOutput)} 方法开始调用:");
46 
47             const int num = 5;
48             for (var i = 0; i < num; i++)
49             {
50                 if (token.IsCancellationRequested)  //监控 CancellationToken
51                 {
52                     return;
53                 }
54 
55                 Console.WriteLine($"{i + 1}/{num} 完成");
56                 Thread.Sleep(1000);
57             }
58         }
59     }

View Code

威尼斯人线上娱乐 77

图3-1

威尼斯人线上娱乐 78

图3-二 注释两行代码

威尼斯人线上娱乐 79

图三-3:图三-一和图3-二的举行理并了结果(注释两行代码)

  上海教室是不调用 Cancel() 方法的结果图,不会吊销职分的推行。

 

  下图在 三 秒后调用 Cancel() 方法撤除职务的实施:

威尼斯人线上娱乐 80

图三-四:去掉注释

威尼斯人线上娱乐 81

图叁-5:图三-一和图三-四的施行结果(去掉注释)

 

 

三、撤除异步操作

 

小结

  • 介绍异步方法的语法、三种差别的归来值类型(void、Task 和
    Task<T>)和调控流程等。
  • 简易常用的异步推行情势:Task.Run()。【注意】它是在分裂的线程上实践办法。
  • 怎么着撤除异步操作。

 

小结

  • 介绍异步方法的语法、两种不一样的归来值类型(void、Task 和
    Task<T>)和调整流程等。
  • 粗略常用的异步试行措施:Task.Run()。【注意】它是在分化的线程上实施格局。
  • 什么样裁撤异步操作。

 

2、使用表明

肆、万分处理

 

传送门

  入门:《初阶接触 async/await
异步编制程序》

  补充篇:《走进异步编制程序的社会风气 –
剖析异步方法(下)》

  GUI 篇:《走进异步编制程序的世界 – 在 GUI
中进行异步操作》

 


最初的作品链接:

 【参考】《Illustrated C# 2012》

传送门

  入门:《发端接触 async/await
异步编制程序》

  补充篇:《走进异步编制程序的世界 –
剖析异步方法(下)》

  GUI 篇:《走进异步编程的社会风气 – 在 GUI
中推行异步操作》

 


原来的书文链接:

 【参考】《Illustrated C# 2012》

办法签字包罗二个 Async 或 async 修饰符。

5、在调用方法中多只地等待职务

 

 

6、在异步方法中异步地等候职责

 

安分守纪约定,异步方法的称号以“Async”后缀结尾。

七、Task.Delay 方法

 

 

小结

 

归来类型为下列项目之一:

传送门

  入门:《开首接触 async/await 异步编制程序》

 


 

–那是预览版本,最终整理完核查后将放上首页,不便之处请见谅–

] 异步编制程序, 剖析异步方法 序
那是上篇《起初接触 async/await
异步编制程序》(入门)的第1章内容,重假如深刻摸底异步方法,建议我们先…

 

假设您的点子有操作数为 TResult 类型的回来语句,则为
Task<TResult>。

 

万壹您的措施没有回去语句或富有未有操作数的回到语句,则为 Task。

 

只要您编写的是异步事件处理程序,则为 Void(Visual Basic 中为 Sub)。

 

威尼斯人线上娱乐 ,关于详细新闻,请参见本大旨前面包车型客车“重临类型和参数”。

 

主意一般包括至少2个 await
表明式,该表明式标志三个点,在该点上,直到等待的异步操作实现措施展才具能再三再四。
同时,将艺术挂起,并且控件重返到艺术的调用方。(那里所谓的挂起正是上文所提到的允诺,异步方法承诺会给调用方二个结出)

 

三、示例

  施行才是考察真理的一级路子。

 

 

using System;

using System.Diagnostics;

using System.Net.Http;

using System.Threading.Tasks;

 

namespace 异步递归

{

    class Program

    {

        static void Main(string[] args)

        {

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            ConsoleAsync1();

            stopwatch.Stop();

            Console.WriteLine(“同步方法用时:” +
stopwatch.ElapsedMilliseconds);

            stopwatch.Reset();

            stopwatch.Start();

            ConsoleAsync();

            stopwatch.Stop();

            Console.WriteLine(“异步方法用时:”+
stopwatch.ElapsedMilliseconds);

 

            Console.Read();

        }

 

        private static async void ConsoleAsync()

        {

            Console.WriteLine(“异步方法初叶”);

            Console.WriteLine(“Result:” + await SumAsync(10));

            Console.WriteLine(“异步方法甘休”);

        }

        private static async Task<int> SumAsync(int part)

        {

            if ((part += 10) >= 100)

            {

                return 100;

            }

            HttpClient client = new HttpClient();

            Task<string> getStringTask =
client.GetStringAsync(“”);

            Console.WriteLine(DateTime.Now.Millisecond + ” 异步 ” +
(await getStringTask).Length);

            return await SumAsync(part);

        }

 

        private static void ConsoleAsync1()

        {

            Console.WriteLine(“同步方法开始”);

            Console.WriteLine(“Result:” + SumAsync1(10));

            Console.WriteLine(“同步方法结束”);

        }

 

        private static int SumAsync1(int part)

        {

            if ((part += 10) >= 100)

            {

                return 100;

            }

            HttpClient client = new HttpClient();

            Task<string> getStringTask =
client.GetStringAsync(“”);

            Console.WriteLine(DateTime.Now.Millisecond + ” 同步 ” +
getStringTask.Result.Length);

            return SumAsync1(part);

        }

    }

}

 

  示例介绍:

 

    一、这几个例子中有二种完毕格局:(一)利用异步编制程序的方法贯彻(二)利用一般同步方式完成

 

    二、同时这些事例中达成了递归,这么些能够不要考虑,博主只是想说美素佳儿(Friso)下在异步的意况下,递归是还是不是管用而已,实验结果为使得。

 

    三、那段代码中的GetStringAsync()方法是得到远程分界面内容用的,重要指标是延长响应时间。

 

  在使用四线程编写端口扫描程序时,小编自身感到到同步和规定全数线程都执行完的小时是一个相比较费心的难题。有园友评论说未来早已不手动创设thread对象了,而是径直利用Task异步方式,作者的互连网编制程序老师也讲到了异步编制程序的优越性。在就学了课本上的文化后,举行了二个总括分享给大家。从.NET四.5开始,用async和await关键字再增添Task.Run是三个尤其科学的异步编制程序模型。

1.await和async

  异步形式从手艺上看正是采纳委托来贯彻的,它的严重性受益是在异步实施的历程中,用户还是能操控UI分界面。使用Task类和行使Thread类有诸多貌似的地点,Task类也是透过调用方法去贯彻三个职务的做到,方法但是是命名格局或匿超级模特式,在推行进程中可选用async和await来落到实处异步实行。async是叁个修饰符,它只好用在格局依然事件处理程序的具名中。对于艺术可分为有重返值和无重临值二种处境,事件则唯有壹种,如上面3条语句所示:

    private async Task<int> MethodAsync();//有再次回到值的异步方法

    private async Task MethodAsync();//无重回值的异步方法

    private async void btnOk_Click();//异步事件处理程序

  await是二个运算符,它象征等待异步推行的结果。也足以知道为await运算符实际上是对章程的重返值实行操作,也正是对Task<Result>进行操作,而不是对章程本人进行操作。还有某个要小心,await是早晚要放在异步方法的里边,就算未有放在中间的话,VS会自行报错。以下是async和await使用的事例: 

    private async void button5_Click(object sender, EventArgs e)
    {
      Task a = Method1Async();
      //此处可继续实施别的代码
      await a;//等待职分a实现
      Task<int> b = Method2Async();
      //此处可继续试行其余代码
      int c = await b;//等待职分b完结,且可以得到职务b的再次回到值
    }

    Task Method1Async();
    async Task<int> Method2Async()
    {
      await Task.Delay(100);
      return 1;
    }

  await和一齐编制程序最大的分歧之处是:异步等待义务成功的时候,在不会继续施行后边的代码时,也不会潜移默化分界面包车型大巴操作。在.NET提供的类中,异步方法都以预定用Async作为后缀,那样能够很精晓的接头这几个方法是异步方法或许壹道方法。

二. 创建义务

  成立职分也正是将任务与要实践的法子联系起来,编写职分实施的办法时,那个点子既可以是同步方法也得以是异步方法,还是能够是匿超级模特式。试行异步方法时,必须用async和Task共同表示尚无重回值的天职,用async和Task<TResult>共同表示重临值为TResult的职务。以下是概念试行职分的艺术。

    private async void button5_Click(object sender, EventArgs e)
    {

      //Task.Run方法表示使用暗许的职务调度程序在线程池中通过后台实行内定的职分

      //假如不必要自身去调度措施,使用这几个方法最方便
      await Task.Run(()=>Method壹Async());//施行一同方法
      int c = await
Task.Run(()=>Method贰Async());//推行异步方法
      await Task.Run(async () => { c = 二;
});//施行异步匿超级模特式
    }
    void Method1Async();
    async Task<int> Method2Async(){…}

  Task.Run方法常用的重载形式有以下四种,别的它也是能够用new关键字显得创造职责,不过那种办法用的不多。

    Task Run(Func<Task> function);//推行不带重回值的职务

    Task<TResult>
Run<TResult>(Func<Task<TResult>>
function);//实施带重回值的职责

    Task<TResult> Run<TResult>(Func<Task<TResult>>
function, CancellationToken
cancellationToken);//试行进程中能够监听打消布告

    Task Run(Func<Task> function, CancellationToken
cancellationToken);//推行进程中得以监听撤销文告

叁. 停歇义务

  在实施任务时确定会现出必要截止职务的情景,那里的告壹段落告诉职务你要赶紧停下来不再进行了,而不是直接销毁职分实例。那里能够打个比方,学生一同出去吃饭了,学生与导师都在班群里面,突然班群里老师说要让同学们聚集,假设具备同学都看看这几个新闻,然后学生们伊始动身,那样就能够正确的聚合。上边的例证有一个很重大的前提,那就是持有同学都要来看这几个音讯,也正是学员是随时监听新闻的。CancellationTokenSource类和CancellationToken结构用于落到实处二10二十四线程、线程池和Task职务的吊销操作,处理情势与地方的事例相似。成立的班群正是CancellationTokenSource对象,收到的文告正是CancellationToken对象。CancellationTokenSource用于创设撤消文告,CancellationToken则用来传播应裁撤操作的打招呼,当调用任务前,能够先创制裁撤源对象CancellationTokenSource
cts=new CancellationTokenSource();,假若希望在30秒后自行发出裁撤通告,能够流传参数CancellationTokenSource(TimeSpan.FromSeconds(30));CancellationToken
ct=cts.Token;,后一句代码是得到撤废的通报。CancellationTokenSource还有三个Cancel方法,将以此本性设为true时,该方法会将富有增加了撤除标志的CancellationToken对象的IsCancellationRequested属性都设置为true,那样撤废文告就传递到了正在实践的任务。

  义务收到裁撤布告后,能够挑选二种情势来终止操作。第3种方法是粗略的从委托再次来到。那种完成形式接近于在调用职分的代码中一个bool值来表示撤除文告,义务收到后就平昔回到了。当使用那种艺术时职分情形的重回值为TaskStatus.RanToCompletion枚举值,它表示符合规律完毕,而不是TaskStatus.Canceled枚举值。第壹种办法是在代码里引发OperationCanceledException十分,并将其传递到在其上呼吁了吊销的号子,选择那种措施收回的天职会改动为用Canceled枚举值表示的情事。达成引发那二个的首荐办法是调用ct.ThrowIfCancellationRequestes();。以下是代码示例,写了三个winform程序,利用进度条来撤除任务。第叁个图是从未有过引发那多少个时,程序退出for循环,实行后边的代码后回去了,第三张图是第3种艺术,引发了那一个后直接跳转到catch语句块了。

威尼斯人线上娱乐 82

威尼斯人线上娱乐 83

威尼斯人线上娱乐 84

     CancellationTokenSource cts;
        private async void button3_Click(object sender, EventArgs e)
        {
            progressBar1.Maximum = 100;
            progressBar1.Value = 0;
            cts = new CancellationTokenSource();
            var aa = MYThreadAsync("a", cts.Token);
            try
            {
                await aa;
                listBox1.Items.Add("await后面");
            }
            catch
            {
                if (aa.IsCanceled)
                    listBox1.Items.Add("a取消");
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            cts.Cancel();
        }

        public async Task MYThreadAsync(string s, CancellationToken ct)
        {
            for (int i = 0; i < 50; i++)
            {
                if (ct.IsCancellationRequested)
                    break;          //点击关闭按钮,IsCancellationRequested就为true,就会退出for循环,这是第一种方式
                progressBar1.Value += 2;
                await Task.Delay(100);
                ct.ThrowIfCancellationRequested();//这是第二种方式,它会终止任务并且返回catch语句块里面
            }
            listBox1.Items.Add("任务" + s + "完成了");
        }

威尼斯人线上娱乐 85

四. 获取任务实行的景况

  在异步编程中,很显然义务试行的状态是一个特别关键的参数。在职务的生命周期里,能够通过Status属性来得到义务施行的情景,当义务成功后还足以经过职分属性知道任务到位的动静。可使用职务实例的Status属性获取职责实践的气象,任务施行的景色用TaskStatus枚举表示,以下是TaskStatus的枚举值:

Created:职务已经早先化,但尚未进入调度布署

WaitingForActivation:该职分已跻身调度布置,正在等候被调度程序激活

WaitingToRun:该职分已被调度程序激活,但未曾伊始执行

Running:该职分正在运作,但从未到位

RanToCompletion:该职务已经打响做到

Canceled:该职责由于被撤回而达成,引发那些或调用方已向该职分的CancellationToken发出确定性信号

Faulted:该职务因为出现未经处理的老大而变成

WaitingForChildrenToComplete:该职务自我已做到,正等待附加的子职务到位

  任务实现情状有关的品质有IsCompleted、IsCanceled和IsFaulted等属性,从单词意思上看简单明白它们的乐趣,在那之中要留意IsCompleted属性表示职分是不是到位,无论是寻常甘休还是因为撤消或尤其而形圣迭戈为完毕。

5. 职责施行的快慢

  有时候大家希望让有些异步操作提供进程通报,以便在分界面中显得异步操作施行的快慢,能够用Progress<T>类来获得职责实行的速度。以下是接纳情势里的Report方法将艺术内变量的值传回创立职责的风云代码里,从而立异进程条的值。

威尼斯人线上娱乐 86

     CancellationTokenSource cts;
        private async void button3_Click(object sender, EventArgs e)
        {
            progressBar1.Maximum = 100;
            progressBar1.Value = 0;
            cts = new CancellationTokenSource();
            CancellationToken ct = cts.Token;
            var pp = new Progress<int>();
            pp.ProgressChanged += (s, n) => {
                progressBar1.Value = n;
            };
            var tt = Task.Run(()=>MYThreadAsync(pp,cts.Token,500),cts.Token);
            try
            {
                await tt;
                if (tt.Exception == null)
                    listBox1.Items.Add("任务完成");
            }
            catch (Exception ex)
            {
                listBox1.Items.Add("异常" + ex.Message);
            }
        }         
        private void button4_Click(object sender, EventArgs e)
        {
            cts.Cancel();
        }
        public  void MYThreadAsync(IProgress<int> progress, CancellationToken ct, int delay)
        {
            int p = 0;//进度
            while (p < 100 && ct.IsCancellationRequested == false)
            {
                p += 1;
                Thread.Sleep(delay);
                progress.Report(p);//这个方法将会触发ProgressChanged事件更新进度条
            }
        }

威尼斯人线上娱乐 87

陆. 定期完毕职务

  无论是服务器依然客户端,都是有定期实现某些职责的急需的。System.Timers.Timer类是3个科学的按期设置类,这一个类能够引发轩然大波,但它私下认可是在线程池中掀起事件,而不是在现阶段线程中引发风浪。Timer类的常用属性有AutoReset和Interval属性,AutoReset是得到或安装叁个bool值,该值为true表示每一次间隔甘休时都抓住三次Elapsed事变,false表示仅在第3回间隔停止时引发3回该事件。Interval属性是收获或设置一次Elapsed事件的间隔时间,该值必须超越零并小于Int.马克斯Value,默许值为100飞秒。Timer类还有多个常用艺术那便是Start和Stop方法。

  还有2个System.Threading.提姆er类,它也是在线程池中定期举行职分,它与前一个Timer类的区别是此类不利用事件模型,而是向来通过提姆erCallback类型的寄托来完成的。该类的构造函数为:Timer(提姆erCallback
callback,Object state,TimeSpan douTime,TimeSpan
period)。callback表示要试行的不贰法门,state代表叁个分包回调方法要选择的新闻的对象,dueTime是第一回调用回调方法在此之前延迟的时间,period表示每一趟调用回调方法的时刻距离,-一意味终止。那样创设对象后,第2次达到dueTime延时时间会自动调用2次callback委托,以后每隔period时间距离调用3回。以下是那三种格局的周转效果和源代码。威尼斯人线上娱乐 88

 

威尼斯人线上娱乐 89

     System.Timers.Timer timer;
        System.Threading.Timer threadtimer;
        private void button2_Click(object sender, EventArgs e)//Timers.Timer
        {
            progressBar1.Maximum = 100;
            progressBar1.Value = 0;
            int pro=0;
            timer = new System.Timers.Timer(500);
            timer.AutoReset = true;
            timer.Elapsed+= (obj, args) =>
            { 
                pro+=5;
                progressBar1.Value = pro;
            };
            timer.Start();
        }

       private void button5_Click(object sender, EventArgs e)
       {
           timer.Stop();
           listBox1.Items.Add("第一个已经停止");
       }
    //Threading.Timer类
       private void button1_Click(object sender, EventArgs e)
       {
           progressBar2.Maximum = 100;
           progressBar2.Value = 0;
           TimeSpan dueTime = new TimeSpan(0, 0, 0, 1);
           TimeSpan period = new TimeSpan(0, 0, 0, 0, 200);
           System.Threading.TimerCallback timecall = new TimerCallback((obj) => progressBar2.Value += 5);
           threadtimer = new System.Threading.Timer(timecall, null, dueTime, period);
       }

       private void button6_Click(object sender, EventArgs e)
       {
           threadtimer.Dispose();
           listBox1.Items.Add("第二个已经停止");
       }

威尼斯人线上娱乐 90

  那篇小说只总计了单个职责的异步实践的底蕴,还得继续读书多职务并行实施。假设有越来越好的才能或然与厂家选取有关的异步才干,希望园友能够提议本人继续攻读。


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图