Ios 如何理解dart异步操作?

Ios 如何理解dart异步操作?,ios,dart,Ios,Dart,我们知道,dart是一种单线程语言。因此,根据文档,我们可以使用Futrure/Stream来实现异步操作。它将耗时的操作发送到事件队列。 让我困惑的是事件队列在哪里工作。它正在处理飞镖威胁?如果是,它将阻止应用程序。 另一个问题是事件队列FIFO队列。如果我有两个操作,一个是需要1分钟的网络请求,另一个是单击事件。这两个操作将发送到事件队列。 那么点击事件是否会被网络请求阻止?因为队列是FIFO队列? 那么,事件队列在哪里工作呢? 多谢各位 需要注意的是,异步和多线程是两件不同的事情。Dart

我们知道,dart是一种单线程语言。因此,根据文档,我们可以使用Futrure/Stream来实现异步操作。它将耗时的操作发送到事件队列。 让我困惑的是事件队列在哪里工作。它正在处理飞镖威胁?如果是,它将阻止应用程序。 另一个问题是事件队列FIFO队列。如果我有两个操作,一个是需要1分钟的网络请求,另一个是单击事件。这两个操作将发送到事件队列。 那么点击事件是否会被网络请求阻止?因为队列是FIFO队列? 那么,事件队列在哪里工作呢?
多谢各位

需要注意的是,异步和多线程是两件不同的事情。Dart使用Futures和
async/await
来实现异步性,但Dart本质上仍然是一种单线程语言

它的工作方式是,当创建未来时(手动或通过调用
async
方法),该进程将被添加到事件队列中,正如您所阅读的。然后,在所有同步执行的中间,每当有暂停时,事件队列可以优先。然后,它可以完成这些过程,并确定是否有任何未来已经完成。如果是这样,结果将传递给等待该资源的任何其他异步进程(如果有的话)

这也意味着,如果你的程序挂在异步操作的中间(通过一个无限循环的简单例子,通过<代码>(true){} <代码> >),它将冻结整个程序,包括同步代码和其他等待处理的异步进程。(即使允许他们解决的条件已经发生)

但是,在您的情况下,这不会是一个问题。如果您以网络请求的形式启动一个异步进程,然后以“单击事件”的形式启动另一个进程(不确定您指的是什么,但我假设它也是异步的),它们都将按该顺序添加到事件队列。但是,如果单击事件在网络请求之前解析,则事件队列将仅识别网络请求未来尚未解析,并将转到已解析的单击事件


作为旁注,值得注意的是,Dart确实具有多线程功能,尽管其方式相当迂回。Dart有一种称为隔离的东西,它不是一个线程,而是一个完全独立的子程序。这意味着隔离不能访问内存中与根程序本身相同的任何数据。但是,数据可以被传递使用
SendPort
s和
ReceivePort
s在两者之间进行隔离。这使得使用隔离比线程稍微复杂一些,但也意味着,如果没有共享内存,它实际上消除了基于线程首先访问内存的争用条件。

感谢您的响应。正如您所说,它将冻结整个pro如果异步操作使用while(true){}。因此,如果我使用Future下载一个大文件,然后点击一个按钮。那么该按钮将不会被响应?@porthuas文件的下载将在后台进行,由平台的任何底层HTTP组件处理。在本例中,Future的目的是在文件下载完成时通知您的代码,而不是处理下载过程本身。除非您使用的HTTP模块设计得非常糟糕,否则进行HTTP调用(如下载文件)的行为不会导致程序在等待完成时挂起。@Abion47明白了!因此,如果事件队列有两个事件A和B,A将阻止B?是吗?@porthuas您似乎觉得事件队列一次只能处理一个未来,在移动到下一个之前等待一个事件完成。在每个事件循环中,所有的期货都会被处理。事件队列只描述期货将被处理的顺序,即使“正在处理”只是意味着识别未来还没有完成。如果a在队列中的B之前,但B首先完成,a不会阻止B。谢谢!我已经编写了以下代码,输出是getTest->test->getTest2。你能解释一下吗。
main(List args){print(“main function start”);var B=getTest();var b1=getTest2();b1。然后((v){print(v);});b.then((v){print(v);});print(“main function end”);}Future getTest(){return Future((){for(var i=0;i<1000000;i++){print(i);}return getTest;}Future getTest2(){return Future((){print(“test”);return getTest2;}