来自 威尼斯国际官方网站 2019-12-06 22:10 的文章
当前位置: 威尼斯国际官方网站 > 威尼斯国际官方网站 > 正文

异步编程

职责到位后自行运维新职务

事实上的支出应用中,平时出现叁次义务到位后立即运转其它三个任务,况且不可以预知使线程拥塞,在职责未有到位时调用result会使程序窒碍,不可能查看职分的进行进程,TASK提供了二个方法ContinueWith,它不会拥塞任何线程,当第二个职责成功时,会应声运转第2个任务。

 1 static void Main(string[] args)
 2         {
 3             Console.WriteLine("开始进行计算");
 4             // ThreadPool.QueueUserWorkItem(Sum, 10);
 5             var  ctx = new CancellationTokenSource();
 6             var task = new Task<int>(() => Sum(ctx.Token, 100000));
 7             task.Start();
 8             var cwt = task.ContinueWith(p =>
 9             {
10                 Console.WriteLine("task result ={0} ",task.Result);
11             });
12             //显示等待获取结果
13             //task.Wait(ctx.Token);
14             Thread.Sleep(1000);
15             ctx.Cancel();
16             //调用Result时,等待返回结果
17             Console.WriteLine("程序结果为 Sum = {0}", task.Result);
18             Console.WriteLine("程序结束");
19             Console.ReadLine();
20         }
21 
22         public static int Sum(CancellationToken cts, object i)
23         {
24             var sum = 0;        
25             for (var j = 0; j <= (int)i; j++)
26             {
27                 if (cts.IsCancellationRequested) return sum;
28                 Thread.Sleep(50);
29                 Console.Write("{0} + ", sum);
30                 sum += j;
31             }
32             Console.WriteLine(" = {0}", sum);
33             return sum;
34         }

异步应用处景及原理

异步主要运用于IO操作,数据库访谈,磁盘操作,Socket访问、HTTP/TCP互连网通讯 

案由:对于IO操作并无需CPU实行过多的总计,那么些多少首要通过磁盘进行管理,假如张开协同通讯不可能收场,要求创设越来越多的线程财富,线程的数额上下文频仍的切换也是对财富的浪费,针对IO操作不要求独自的分配三个线程来管理。

譬喻表明:

操作:服务器收到HTTP诉求对数据库举行操作然后回去

一块管理哀告的线程会被封堵,异步管理央浼的线程不会梗塞。

图片 1

 

异步和四线程

相通点:制止调用线程梗塞,从而巩固软件的可响应性。

不同点:

异步操作无须额外的线程肩负,而且选用回调的办法实行拍卖,在计划精良的景象下,管理函数能够无需选拔分享变量(纵然不大概完全不用,最起码能够减掉 分享变量的数目),减弱了死锁的大概。C#5.0 .NET4.5 以往首要字Async和Await的行使,使得异步编制程序变得至极轻便。

八线程中的处理程序依旧是各样实践,然而八十二线程的劣点也长期以来大名鼎鼎,线程的施用(滥用)会给系统带给上下文切换的额外肩负。並且线程间的分享变量大概引致死锁的产出。

如何是异步?

异步管理不用窒碍当前线程来等待管理达成,而是允许继续操作,直至其余线程将处理完了,并回调布告此线程。

Async&Await 轻易利用

选拔Async&Await的重大指标是造福实行异步操作,因为.net 4.0 在此以前进行异步操作时相比较复杂的,重如果透过调用微软提供的异步回调方法实行编制程序,假如凌驾供给团结完结的艺术显得分外头痛,.net的逐风华正茂版本都有投机首选的本事,像.NET1.第11中学的委托,.NET2.0中的泛型,.NET3.0中的Linq,.NET4.0中的Dynimac,.net4.5首推的正是异步编制程序,我们只必要领悟TASK+异步函数就能够完结异步编制程序。

async:告诉CL大切诺基那是多个异步函数。

await:  将Task<TResult>再次回到值的函数进行异步管理。

 

示范指标:获取网站JS代码,并在分界面呈现。

 1  private static async Task<string> DownloadStringWithRetries(string uri)
 2         {
 3             using (var client = new HttpClient())
 4             {
 5                 // 第1 次重试前等1 秒,第2 次等2 秒,第3 次等4 秒。
 6                 var nextDelay = TimeSpan.FromSeconds(1);
 7                 for (int i = 0; i != 3; ++i)
 8                 {
 9                     try
10                     {
11                         return await client.GetStringAsync(uri);
12                     }
13                     catch
14                     {
15                     }
16                     await Task.Delay(nextDelay);
17                     nextDelay = nextDelay + nextDelay;
18                 }
19                 // 最后重试一次,以便让调用者知道出错信息。
20                 return await client.GetStringAsync(uri);
21             }
22         }

 1  static  void Main(string[] args)
 2         {
 3             Console.WriteLine("获取百度数据");
 4             ExecuteAsync();
 5             Console.WriteLine("线程结束");
 6             Console.ReadLine();
 7         }
 8 
 9         public static async void ExecuteAsync()
10         {
11            string text = await DownloadStringWithRetries("http://wwww.baidu.com");
12            Console.WriteLine(text);
13         }

运行结果开采,首先得到百度数码,线程截止,最后呈现HTML代码,那是因为异步开启了新的线程,并不会促成线程堵塞。

 

撤销职分

职务的废除相近应用的是.NET Framework的标准裁撤操作情势,首先供给创建八个CancellationTokenSource对象,然后在函数中投入参数CancellationToken,将CancellationTokenSource的Token传递给艺术,然后调用IsCancellationRequested获取是还是不是曾经撤回该值举行决断。

 1 static void Main(string[] args)
 2         {
 3             Console.WriteLine("开始进行计算");
 4             // ThreadPool.QueueUserWorkItem(Sum, 10);
 5             var  ctx = new CancellationTokenSource();
 6             var task = new Task<int>(() => Sum(ctx.Token, 100000));
 7             task.Start();
 8             //显示等待获取结果
 9             //task.Wait(ctx.Token);
10             Thread.Sleep(1000);
11             ctx.Cancel();
12             //调用Result时,等待返回结果
13             Console.WriteLine("程序结果为 Sum = {0}", task.Result);
14             Console.WriteLine("程序结束");
15             Console.ReadLine();
16         }
17 
18         public static int Sum(CancellationToken cts, object i)
19         {
20             var sum = 0;        
21             for (var j = 0; j <= (int)i; j++)
22             {
23                 if (cts.IsCancellationRequested) return sum;
24                 Thread.Sleep(50);
25                 Console.Write("{0} + ", sum);
26                 sum += j;
27             }
28             Console.WriteLine(" = {0}", sum);
29             return sum;
30         }

前言

本节任重先生而道远介绍异步编制程序中Task、Async和Await的底工知识。

任务

  在接纳职务早先,针对线程的调用多数都用线程池提供的静态方法QueueUserWorkItem,然而这一个函数有相当多的界定,当中最大的主题材料固然未有中间机制得以让开拓者知道操作在什么样时候做到,也从没编写制定在操作完成时拿到重回值,微软为了解决这几个主题素材引进了任务的定义。

 首先结构三个Task<TResult>对象,并为TResult传递再次来到值,起先职分之后等待它并赶回结果,示例代码:

 1 static void Main(string[] args)
 2         {
 3             Console.WriteLine("开始进行计算");
 4            // ThreadPool.QueueUserWorkItem(Sum, 10);
 5             Task<int> task = new Task<int>(Sum, 100);
 6             task.Start();
 7             //显示等待获取结果
 8             task.Wait();
 9             //调用Result时,等待返回结果
10             Console.WriteLine("程序结果为 Sum = {0}",task.Result);
11             Console.WriteLine("程序结束");
12             Console.ReadLine();
13         }
14 
15         public static int Sum(object i)
16         {
17             var sum = 0;
18             for (var j = 0; j <= (int) i; j++)
19             {
20                 Console.Write("{0} + ",sum);
21                 sum += j;
22             }
23             Console.WriteLine( " = {0}",sum);
24             return sum;
25         }

而外wait等待单个职务外,task还提供了守候多少个义务,WaitAny和WaitAll,它阻挡调用线程,直到数组中保有的Task对象完毕。

本文由威尼斯国际官方网站发布于威尼斯国际官方网站,转载请注明出处:异步编程

关键词: