C#异步编程(一)

概要

这里记录一下初始学习异步编程。首先理解异步这个操做:举个例子来讲吧。咱们每一个人能够作
不少事情(这里用:事情一,事情二,事情三),咱们本身若是须要完成这三件事情的话,那么
基本上来讲是要有顺序的一件一件的完成,也就是“一心不能二用”的道理。那么若是咱们想提升
效率,快速的完成这三件事情呢,那咱们按照人的惯性思惟,找人帮忙作就好了。其实异步就跟
这个道理差很少。程序代码是由线程来调用执行的,其实一个线程就至关于一我的的意思。在程
序代码中为了解决文件IO的操做和网络请求等相关操做,咱们会用对其采用脱离主线程,采用异
步新开启一个线程去操做文件IO或者Web请求,从而实现提升程序的效率,也避免了主线程迟迟
等待文件IO或者Web请求完成才能继续执行下一步代码的问题。

观察下面的代码和程序运行结果:
步骤一:新建一个控制器应用程序(.Net Framework4.5以上)项目
这里写图片描述
下面咱们看看运行结果
这里写图片描述
简单说明:这一步就至关于一我的须要作几件事情的情形。一我的也就是一个线程,这里可以看见线程ID都是1。web

步骤二:采用异步方法实现
代码以下:编程

static void Main(string[] args)
{
    #region 以往异步实现
    ////当前线程(由于词句代码放在哪一个线程代码模块下执行就表示哪一个线程进行休眠)开始休眠指定的时间。
    //Console.WriteLine("do something..."+Thread.CurrentThread.ManagedThreadId);
    ////模拟耗时操做
    //Thread.Sleep(3000);
    //Console.WriteLine("do other something..."+Thread.CurrentThread.ManagedThreadId);
    #endregion
    #region 
    Console.WriteLine("Main executing....currentThreadID为:"+Thread.CurrentThread.ManagedThreadId);
    DoSomething();
    Console.WriteLine("Main executed..currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
    #endregion
    Console.ReadKey(true);
}
/// <summary>
/// 执行耗时的异步操
/// 注意:
/// 代码实现中若是是异步,那么此方法名就须要(标记)成异步方法,即加上:aysnc修饰词
/// </summary>
private async static void DoSomething()
{
    //耗时操做有:IO/Web跳转等操做。
    //归结为:网络,文件操做是耗时操做。
    Console.WriteLine("耗时操做开始。。。currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
    //Thread.Sleep(3000);
    //换成异步执行代码:必须是一个任务类型
    await Task.Run(()=> {
        Console.WriteLine("延迟3秒进行中...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(3000);
    });//委托方法
    Console.WriteLine("耗时操做结束。。。currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
}

这里咱们首先看看执行以往的延迟方式:
这里写图片描述
下面看看运行结果:
这里写图片描述
分析:
从上面这个结果,执行的过程咱们可以发现,“耗时操做结束。。。currentThreadID为:1”不执行完,“Main executed…currentThreadID为:1”始终处于等待中。网络

再看下面异步执行的状况:
这里写图片描述
运行结果
这里写图片描述异步

结果分析:
经过执行结果,咱们可以看出,延迟操做交给了经过await标记的代码片断执行了,同时开启了新的线程,原来的 当前主线程ID为1,异步开启的新线程ID为3。async

demo中包含Winform项目加载图片
Demo下载svg