首页 > 代码库 > await和async关键字来写异步程序

await和async关键字来写异步程序

await和async关键字出现于.Net5.0,方便写异步程序。

例子:

public class MyClass  
{  
    public MyClass()  
    {  
        DisplayValue(); //这里不会阻塞  
        System.Diagnostics.Debug.WriteLine("MyClass() End.");  
    }  
    public Task<double> GetValueAsync(double num1, double num2)  
    {  
        return Task.Run(() =>  
        {  
            for (int i = 0; i < 1000000; i++)  
            {  
                num1 = num1 / num2;  
            }  
            return num1;  
        });  
    }  
    public async void DisplayValue()  
    {  
        double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回  
        //这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用  
        System.Diagnostics.Debug.WriteLine("Value is : " + result);  
    }  
}  

要执行异步操作的方法用async标记,调用方法时用await标记,被异步调用的方法返回值用<task>修饰。

实际执行代码:

public void DisplayValue()  
{  
    System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();  
    awaiter.OnCompleted(() =>  
        {  
            double result = awaiter.GetResult();  
            System.Diagnostics.Debug.WriteLine("Value is : " + result);  
        });  
} 

以下为某大神写的静态类,可以将一般方法转化为异步调用:

public static class TaskAsyncHelper  
02.{  
03.    /// <summary>  
04.    /// 将一个方法function异步运行,在执行完毕时执行回调callback  
05.    /// </summary>  
06.    /// <param name="function">异步方法,该方法没有参数,返回类型必须是void</param>  
07.    /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法没有参数,返回类型必须是void</param>  
08.    public static async void RunAsync(Action function, Action callback)  
09.    {  
10.        Func<System.Threading.Tasks.Task> taskFunc = () =>  
11.        {  
12.            return System.Threading.Tasks.Task.Run(() =>  
13.            {  
14.                function();  
15.            });  
16.        };  
17.        await taskFunc();  
18.        if (callback != null)  
19.            callback();  
20.    }  
21.  
22.    /// <summary>  
23.    /// 将一个方法function异步运行,在执行完毕时执行回调callback  
24.    /// </summary>  
25.    /// <typeparam name="TResult">异步方法的返回类型</typeparam>  
26.    /// <param name="function">异步方法,该方法没有参数,返回类型必须是TResult</param>  
27.    /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法参数为TResult,返回类型必须是void</param>  
28.    public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback)  
29.    {  
30.        Func<System.Threading.Tasks.Task<TResult>> taskFunc = ()=>  
31.            {  
32.                return System.Threading.Tasks.Task.Run(()=>  
33.                    {  
34.                        return function();  
35.                    });  
36.            };  
37.        TResult rlt = await taskFunc();  
38.        if(callback != null)  
39.            callback(rlt);  
40.    }  
41.}  

 

await和async关键字来写异步程序