【发布时间】:2019-06-20 18:22:33
【问题描述】:
我有一个简单的程序来测试 async/await,有 2 个版本:版本 1 在 async 函数中等待另一个方法,版本没有:
方案一:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("main starts..");
AsyncMethod();
Thread.Sleep(1000);
Console.WriteLine("main ends..");
Console.ReadLine();
}
static async void AsyncMethod()
{
Console.WriteLine("async starts");
var result = await MyMethod();
Console.WriteLine("async starts ends");
}
static async Task<int> MyMethod()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("async runs" + i.ToString() + "..");
await Task.Delay(1000);
}
return 0;
}
}
方案二:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("main starts..");
AsyncMethod();
Thread.Sleep(1000);
Console.WriteLine("main ends..");
Console.ReadLine();
}
static async void AsyncMethod()
{
Console.WriteLine("async starts");
for (int i = 0; i < 5; i++)
{
Console.WriteLine("async runs" + i.ToString() + "..");
await Task.Delay(1000);
}
Console.WriteLine("async ends");
}
}
两个程序产生相同的结果。我只是好奇,这两个程序在后台发生的事情上有什么不同吗?
我猜,程序1会创建2个子线程,每一层的“异步”都会引出一个线程;程序 2 将创建 1 个子线程。对吧?
只要“await”会一直等到任务结束,那和写同步代码有什么区别呢?我认为它只是链接创建多个线程并为所有线程调用“.join()”。对吧?
【问题讨论】:
-
这段代码有几个问题:(1)你为什么使用Thread.Sleep? (2) 为什么你的 Main 方法不是异步的? (3) 为什么要调用 AsyncMethod() 而没有继续或异常处理程序? (4) 异步不代表线程
-
你期待看到什么?
-
(5) 不要在处理程序中使用“async void”(改用“usync Task”)
-
如果不使用Thread.sleep,那我应该使用什么样的睡眠呢?
标签: c# multithreading asynchronous join async-await