使用async 和 await方法来

时间:2023-03-09 15:47:48
使用async 和 await方法来

先看直接的代码请求方式地啊;

这里是我们同步方法的实现:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication3
{
class Program
{
private static readonly Stopwatch Watch = new Stopwatch();
static void Main(string[] args)
{
Watch.Start();
const string url1 = "http://www.cnblogs.com/";
const string url2 = "http://www.cnblogs.com/liqingwen/"; var result1 = CountCharacters(, url1);
var result2 = CountCharacters(, url2); // 三次调用 ExtraOperation 方法(主要是通过拼接字符串达到耗时操作)
for (var i = ; i < ; i++)
{
ExtraOperation(i + ); //模拟主线程执行一些耗时的各种操作地啊; }
//控制台输出
Console.WriteLine($"{url1} 的字符个数:{result1}");
Console.WriteLine($"{url2} 的字符个数:{result2}"); Console.WriteLine($"总共耗时: {Watch.ElapsedMilliseconds} ms");
Console.ReadLine(); }
private static int CountCharacters(int id,string address)
{
var client = new WebClient();
Console.WriteLine($"开始调用 id={id} : {Watch.ElapsedMilliseconds} ms"); var result = client.DownloadString(address);
Console.WriteLine($"调用完成 id={id} : {Watch.ElapsedMilliseconds} ms"); return result.Length; }
private static void ExtraOperation(int id)
{
//这里是通过拼接字符串进行一些相对耗时的操作
var s = ""; for (var i = ; i < ; i++)
{
s += i;
} Console.WriteLine($"id = {id} 的 ExtraOperation 方法完成:{Watch.ElapsedMilliseconds} ms");
}
}
}

结果:有误差;

使用async 和 await方法来

接着配合我们的aync 和 我们 await 方式来进行。。。

   private static readonly Stopwatch Watch = new Stopwatch();
static void Main(string[] args)
{
Watch.Start();
const string url1 = "http://www.cnblogs.com/";
const string url2 = "http://www.cnblogs.com/liqingwen/"; //两次调用 CountCharactersAsync 方法(异步下载某网站内容,并统计字符的个数)
Task<int> t1 = CountCharacters(, url1);
Task<int> t2 = CountCharacters(, url2); // 三次调用 ExtraOperation 方法(主要是通过拼接字符串达到耗时操作)
for (var i = ; i < ; i++)
{
ExtraOperation(i + ); //模拟主线程执行一些耗时的各种操作地啊; }
//控制台输出
Console.WriteLine($"{url1} 的字符个数:{t1.Result}");
Console.WriteLine($"{url2} 的字符个数:{t2.Result}"); Console.WriteLine($"总共耗时: {Watch.ElapsedMilliseconds} ms");
Console.ReadLine(); }
private static async Task<int> CountCharacters(int id,string address)
{
var client = new WebClient();
Console.WriteLine($"开始调用 id={id} : {Watch.ElapsedMilliseconds} ms"); var result = await client.DownloadStringTaskAsync(address);
Console.WriteLine($"调用完成 id={id} : {Watch.ElapsedMilliseconds} ms"); return result.Length; }
private static void ExtraOperation(int id)
{
//这里是通过拼接字符串进行一些相对耗时的操作
var s = ""; for (var i = ; i < ; i++)
{
s += i;
} Console.WriteLine($"id = {id} 的 ExtraOperation 方法完成:{Watch.ElapsedMilliseconds} ms");
}

结果,有误差:

使用async 和 await方法来

没有把必要花费在等待外部资源的请求的等待中,我们可让一其异步,然后执行我们的主线程的任务;

关于异步,多线程的几个尝试;

1. 一口一口的吃蛋糕和将蛋糕切成几份来吃没有区别;反而在切蛋糕会浪费不少的时间地呀;

2.线程初始化的时候,记住主线程的速度比子线程快,

3.本例子中使用了webclient,发送http请求,没有必要一直等待请求响应,所以主线程的做点其他的事情;

关于异步编程,还在继续进行中...........