个人随笔
技术改变世界

C# Async与Await的使用

这个是.NET 4.5的特性,所以要求最低.NET版本为4.5。

看很多朋友还是使用的Thread来使用异步多线程操作,基本上看不见有使用Async、Await进行异步编程的。各有所爱吧,其实都可以。只要正确使用就行,不过还是写了这篇文章推荐大家使用Async、Await。 原因就是:可以跟写同步方法一样去异步编程。代码则就非常的清晰,就跟写普通的代码一样,不用关系如何去异步编程,也让很多初级程序员也能够异步编程了。下面是一个使用Thread 多线程实现的异步例子,以及一个使用Async与Await的异步例子,接下来我们再简单理解下Async与Await的相关技术说明。

Thread多线程异步编程例子

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("主线程测试开始..");
        Thread th = new Thread(ThMethod);
        th.Start();
        Thread.Sleep(1000);
        Console.WriteLine("主线程测试结束..");
        Console.ReadLine();
    }


    static void ThMethod()
    {
        Console.WriteLine("异步执行开始");
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine("异步执行" + i.ToString() + "..");
            Thread.Sleep(1000);
        }
        Console.WriteLine("异步执行完成");
    }
}

以上代码运行效果如下图

Async Await

 

使用Async与Await进行异步编程

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("主线程测试开始..");
        AsyncMethod();
        Thread.Sleep(1000);
        Console.WriteLine("主线程测试结束..");
        Console.ReadLine();
    }

    static async void AsyncMethod()
    {
        Console.WriteLine("开始异步代码");
        var result = await MyMethod();
        Console.WriteLine("异步代码执行完毕");
    }

    static async Task<int> MyMethod()
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine("异步执行" + i.ToString() + "..");
            await Task.Delay(1000); //模拟耗时操作
        }
        return 0;
    }
}

运行效果:

Async Await2

显而易见我们就跟写同步方法一样,完成了异步方法的编写,代码更清晰了。

只有拥有async才能在其内部使用await关键字。异步方法可以具有Task、Task<>或void的返回类型;

await关键字则是用于返回值是“可等待”类型(awaitable)的方法

转载请注明出处王旭博客 » C# Async与Await的使用

分享到:更多 ()

评论 4

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #2

    接一楼网友的,如果要异步执行应该这么些
    await Task.Run(() =>
    {
    for (int j = 0; j < 100000000; j++)
    {
    int k = j / (j + 1);
    }
    });
    在一个异步方法里面总要有一部分是可等待的

    Zeeko10个月前 (06-18)回复
  2. #1

    await Task.Delay(1000); //模拟耗时操作
    这步不是单纯的模拟耗时操作吧,应该是由于这个Task.Delay比较特殊才能异步,如果把代码改成以下,就是同步执行了:
    static async Task MyMethod()
    {
    for (int i = 0; i < 5; i++)
    {
    Console.WriteLine("异步执行" + i.ToString() + "..");
    for (int j = 0; j < 100000000; j++)
    {
    int k = j / (j + 1);
    }
    //await Task.Delay(1000); //模拟耗时操作
    }
    return 0;
    }

    Jean2年前 (2015-01-23)回复
    • 网友道出了实际,如果不写,确实是同步方法,我已经试验过了

      挽风曲2年前 (2015-09-17)回复
      • 对也不全对,我的理解是,如果想要异步,必须用await关键字,这个关键字会阻塞主线程,从而会开启新的线程去做他wait的事情,但是新的线程必须满足返回值为Task类型。你可以试试看一楼的高手的方法,把你的循环报刊的lamda表达式里面,然后用await调用,就是异步的了。

        风清扬7个月前 (09-19)回复