如何以及何时使用“异步”和“等待”

根据我的理解,asyncawait所做的主要事情之一是使代码易于编写和读取,但使用它们是否等同于生成后台线程来执行长时间逻辑

我正在尝试最基本的例子。我在内联添加了一些注释。你能给我澄清一下吗

//我不明白为什么这个方法必须标记为'async'。
私有异步无效按钮1\u单击(对象发送方,事件参数e)
{
Task<int>access=DoSomethingAsync();
//任务无关的东西
//从睡眠5秒后到达此线路
//DoSomethingAsync()方法。是否应该立即访问它?
INTA=1;
//据我所知,等待应该在这里完成。
int x=等待访问;
}
异步任务<int>DoSomethingAsync()
{
//这是在后台线程上执行的吗?
系统线程线程睡眠(5000);
返回1;
}

当使用asyncwait时,编译器在后台生成一个状态机

下面是一个例子,我希望我能解释一些正在进行的高层细节:

公共异步任务MyMethodAsync()
{
Task<int>longRunningTask=LongRunningOperationAsync();
//不需要LongRunningOperationAsync结果的独立工作可以在这里完成
//现在我们呼吁等待这项任务
int result=等待长时间运行任务;
//使用结果
控制台写入线(结果);
}
公共异步任务<int>LongRunningOperationAsync()//假设我们从这个长时间运行的操作返回一个int
{
等待任务。延迟(1000);//1秒延迟
返回1;
}

好的,那么这里发生了什么:

  1. 任务<int>longRunningTask=LongRunningOperationAsync()开始执行LongRunningOperation

  2. 独立工作在主线程上完成(线程ID=1),然后到达wait longlunningtask

    现在,如果longRunningTask尚未完成且仍在运行,MyMethodAsync()将返回其调用方法,因此主线程不会被阻塞。当longRunningTask完成时,线程池中的线程(可以是任何线程)将返回到其上一上下文中的MyMethodAsync(),并继续执行(在本例中,将结果打印到控制台)

第二种情况是,longRunningTask已经完成执行,并且结果可用。当到达wait longRunningTask时,我们已经得到了结果,因此代码将继续在同一个线程上执行。(在这种情况下,将结果打印到控制台)。当然,上述示例并非如此,其中涉及任务。延迟(1000)

发表评论