为了账号安全,请及时绑定邮箱和手机立即绑定

如果async-await没有创建任何其他线程,那么它如何使应用程序响应?

如果async-await没有创建任何其他线程,那么它如何使应用程序响应?

HUH函数 2019-07-29 10:59:36
如果async-await没有创建任何其他线程,那么它如何使应用程序响应?一次又一次,我看到它说使用async- await不会创建任何额外的线程。这没有任何意义,因为计算机一次看起来只做一件事以上的唯一方法就是实际上一次做多件事(并行执行,使用多个处理器)通过调度任务并在它们之间切换来模拟它(做一点A,一点点B,一点A,等等)因此,如果async- await这些都没有,那么它如何使应用程序响应?如果只有一个线程,则调用任何方法意味着在执行任何其他操作之前等待方法完成,并且该方法中的方法必须在继续之前等待结果,依此类推。
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

计算机一次出现多于一件事的唯一方法是(1)实际上一次做多于一件事,(2)通过调度任务和在它们之间切换来模拟它。因此,如果async-await没有这些

这并不是说等待确实没有这些的。请记住,目的await不是使同步代码神奇地异步。这是为了在调用异步代码时使用我们用于编写同步代码的相同技术。等待是关于使用高延迟操作的代码看起来像使用低延迟操作的代码。这些高延迟操作可能在线程上,它们可能在特殊用途的硬件上,它们可能会将它们的工作分解成小块并将其放入消息队列中以供稍后由UI线程处理。他们正在做一些事情以实现异步,但他们是那些正在做的人。等待只是让你利用这种异步。

另外,我认为你缺少第三种选择。我们老人们 - 今天有说唱音乐的孩子应该从我的草坪上下来等 - 记住20世纪90年代早期的Windows世界。没有多CPU机器也没有线程调度程序。你想同时运行两个Windows应用程序,你必须屈服。多任务是合作的。操作系统告诉进程它会运行,如果它不正常,它会使所有其他进程无法服务。它一直运行直到它产生,并且不知何故它必须知道如何在下次操作系统控制回到它时它停止的地方。单线程异步代码非常类似,使用“await”而不是“yield”。等待的意思是“我要记住我在这里离开的地方,让其他人跑了一会儿;当我等待的任务完成时,给我回电话,我会在我离开的地方接我。” 我认为你可以看到它如何使应用程序更具响应性,就像在Windows 3天中一样。

调用任何方法意味着等待方法完成

有你失踪的钥匙。 方法可以在其工作完成之前返回。这就是异步的本质。一个方法返回,它返回一个任务,意味着“这项工作正在进行中;告诉我完成后该做什么”。该方法的工作尚未完成,即使它已经返回

在await运算符之前,你必须编写看起来像spaghetti穿过瑞士奶酪的代码,以处理我们在完成后有工作要做的事实,但返回和完成失去同步。Await允许您编写看起来像返回和完成同步的代码,而不会实际同步它们。


查看完整回答
反对 回复 2019-07-29
  • 3 回答
  • 0 关注
  • 693 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信