用async await做了几次试验,觉得这俩关键字很是邪门
写一个异步方法如下:
测试方法1:
class Program
{
static void Main(string[] args)
{
var result = MyMethod(); //将异步执行
Console.WriteLine("end");
Console.ReadLine();
}
static async Task<int> MyMethod()
{
for (int i = 0; i < 5; i++)
{
await Task.Delay(1000); //模拟耗时操作
Console.WriteLine("异步执行" + i.ToString() + "..");
}
return 0;
}
}
输出结果:
测试方法2:(Console.WriteLine(result.Result); //比方法1多了一行)
class Program
{
static void Main(string[] args)
{
var result = MyMethod(); //将异步执行
Console.WriteLine(result.Result); //比方法1多了一行
Console.WriteLine("end");
Console.ReadLine();
}
static async Task<int> MyMethod()
{
for (int i = 0; i < 5; i++)
{
await Task.Delay(1000); //模拟耗时操作
Console.WriteLine("异步执行" + i.ToString() + "..");
}
return 0;
}
}
输出结果:
这里发现 方法二还是同步执行的,并没有异步执行,因为调用了值result.Result,导致方法同步执行了,也必须同步执行,否则 result 取不到值
测试方法3
class Program
{
static void Main(string[] args)
{
var result = MyMethod();
Console.WriteLine("end");
Console.ReadLine();
}
static async Task<int> MyMethod()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("异步执行" + i.ToString() + "..");
await TestMethod();
}
return 0;
}
static Task TestMethod()
{
//死循环,永远执行
while (true)
{
}
return Task.CompletedTask;
}
}
输出结果:
测试方法3:发现 “Console.WriteLine("end");”这行代码没有输出,
也就是说 “var result = MyMethod();” 并没有异步执行,
目前我已经是凌乱状态,为什么没有异步执行MyMethod,
虽然TestMethod这里写的是一个死循环while (true){},但是我理解的预期效果应该是输出Console.WriteLine("end");
已经完全搞不懂 async 和 await
google了一会儿,发现这个:
主要意思应该是async/await并没有创建一个新的线程,因为
TestMethod
没有创建新的线程(比如使用Task.Run
啊之类的),所以死循环还是会卡死当前的主线程的。来源是:https://stackoverflow.com/que...,推荐看一看