您的位置:首页 > 编程语言 > C#

C#的async和await

2015-10-22 10:31 218 查看
学习。。

首先我们写个例子:

public class MyClass

{

public MyClass()

{

//调用该方法不会阻塞

ShowValue();

Console.WriteLine("MyClass() End.");

}

public Task<int> GetValueAsync(int number1, int number2)

{

return Task.Run(() =>

{

for (var i = 0; i < 1000000; i++)

{

number1 = number1 + number2;

}

return number1;

});

}

public async void ShowValue()

{

//此处会开新线程处理GetValueAsync任务,然后方法马上返回

double result = await GetValueAsync(2143, 55);

//这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用

Console.WriteLine("Value is : " + result);

}

#region 其他实例

///异步打印传入的字符串

public async static Task<string> AsyncAdd(string str)

{

string result = await PringString(str);

return result;

}

public async static Task<string> PringString(string str)

{

return "Hello World" + str;

}

#endregion

}


上面在MyClass的构造函数里调用了async关键字标记的异步方法DisplayValue(),DisplayValue()方法里执行了一个await关键字标记的异步任务GetValueAsync(),这个异步任务必须是以Task或者Task<TResult>作为返回值的,而我们也看到,异步任务执行完成时实际返回的类型是void或者TResult,DisplayValue()方法里await GetValueAsync()之后的所有代码都会在异步任务完成时才会执行。



DisplayValue()方法实际执行的代码如下:

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);

});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: