异步编程(二):async/await模式之基本操作

2019-02-23  本文已影响0人  曦航老袁

在C#语言中,Async/AWait特性可以创建并使用异步方法。该特性由三个部分组成:

调用方法:

Class Program
{
    static void Main()
    {
        ...
        Task<int> value = DoAsyncStuff.CalculateSumAsync(5, 6);
        ...
    }
}

异步方法:

static class DoAsyncStuff 
{
    public static async Task<int> CalculateSumAsync(int i1, int i2)
    {
        int sum = await TakeEx.Run(()=>GetSum(i1, i2));
        return sum;
    }
}

如上所述,异步方法在完成工作之前即返回调用方法,然后在调用方法继续执行时完成工作。在语法上,异步方法具有如下的特点:

方法的async关键字

异步方法的返回类型

Task<int> value = DoStuff.CalculateSumAsync(5, 6);
...
Console.WriteLine( “Value: {0}”, value.Result);

任何返回Task<T>类型的异步方法其返回值必须为T类型或可以隐式转换为T的类型。

Task someTask = Dostuff.CalculateSumAsync(5, 6);
...
someTask.wait();

例:使用返回Task<T>对象的异步方法:

using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        Task<int> value = DoAsyncStuff.CalculateSumAsync(5, 6);
        // 处理其他事情…
        Console.WriteLine(“Value: {0}”, value.Result);
    }
}

static class DoAsyncStuff
{
    public static async Task<int>  CalculateSumAsync(int i1, int i2)
    {
        int sum=await Task.Run(()=>GetSum(i1,i2));
        return sum;
    }

    private static int GetSum(i1, i2)
    {
        return i1 + i2;
    }
}

例:使用返回Task对象的异步方法

using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        Task someTask = DoAsyncStuff.CalculateSumAsync(5, 6);
        // 处理其他事情……
        someTask.Wait();
        Console.WriteLine ( “Async stuff is done”);
    }
}

static class DoAsyncStuff 
{
    public static async Task CalculateSumAsync(i1, i2);
    {
        int value = await Task.Run(() => GetSum(i1, i2);
        Console.WriteLine(“Value {0}”, value);
    }

    private static int GetSum(int i1, int i2)
    {
        return i1 + i2;
    }
}

例:使用“调用并遗忘”的异步方法

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        DoAsyncStuff.CalculateSumAsync(5, 6);
        // 处理其他事情…
        Thread.Sleep(200);
        Console.WriteLine(“Program Exiting”);
    }
}

static class DoAsyncStuff
{
    public static async void CalculateSumAsync(int i1, int i2)
    {
        int value = await Task.Run(() => GetSum(i1, i2);
        Console.writeLine(“value: {0}, value);
    }

    private static int GetSum(int i1, int i2)
    {
        return i1 + i2;
    }
}
上一篇下一篇

猜你喜欢

热点阅读