我在Flutter / Dart异步代码执行方面遇到问题,如其工作方式

问题描述 投票:0回答:1

[在Flutter中,我们使用async await和Future,有人可以解释一下,如果我们不使用另一个线程(在dart中不能使用它)并且在主UIThread上运行作业,只会使应用程序变得不稳定,因为即使我们正在等待作业执行,它将最终仅在UIThread上执行。我也在某处读到有关隔离株的信息。但是无法描绘出确切的图片。如果有人可以详细解释。

flutter dart
1个回答
0
投票

我认为您错过了Dart异步方法中的某些功能。Dart是单线程编程语言,Java或C#是多线程编程语言,请不要将异步作为新线程使用,这在Dart中不会发生。Dart是一种单线程编程语言。这意味着Dart一次只能运行一条指令,而Java可以同时运行多条指令。

通常,您在Dart中所做的一切都将从UI-Thread开始。无论您在Dart中调用哪种方法,无论使用同步,异步,它们都将在UI-Thread上运行,因为Dart是一个单线程。在像Javascript和Dart这样的单线程语言中,异步方法不是并行执行的,而是遵循由事件循环处理的常规事件序列。如果您以多线程语言运行以下代码,则提取会花费一些时间来执行,这会带来一些问题(我将说方法,如下所示):

String user = new Database.fetch(David);
String personalData = new Database.fetch(user);

您将在用户中收到David的数据,然后,您将收到您的数据。这将锁定您的UI,并且对于Java之类的语言都具有Threads,您可以使用它们在后台,另一个线程上执行此任务,并且UI-Thread将平稳运行。

如果您在Dart进行此操作

String user = new Database.fetch(David);
String personalData = new Database.fetch(user);

用户在personalData中将为null,因为fetch事件是Future。

如何在Dart中解决此问题?

String user = await Database.fetch(David);
String personalData = await Database.fetch(user);

对于那些喜欢更实用的范例(我不喜欢)的人,可以使用。

Database.fetch(David).then((user){
Database.fetch(user).then((personal){
String personalData = personal;
});
});

但是,假设您在该数据库中拥有数十亿个数据,这项繁重的任务可能会导致屏幕上的动画冻结,并且您会在用户界面中看到一个垃圾,因为这些隔离是被发明出来的。

Dart隔离为您提供了一种在Dart中执行真正的多线程的方法,它们具有自己独立的堆(内存),并在后台运行代码,就像MultiThread语言的线程一样。我可以解释隔离是如何工作的,但是它将使响应变得非常大,并且目的只是区分异步/多线程方法。

解决上述问题的一种简单方法,使用隔离,将使用计算。

创建计算是为了促进隔离的创建,您只需传递函数和该函数将执行的数据,就这样!重要的是要记住,计算是未来,因此您必须先使用await,然后才能获取结果。

在我们的示例中,我们可以创建一个新线程并在完成像这样的调用后获得它的结果:

String user = await compute(Database.fetch,David);
String personalData = await compute(Database.fetch,user);

非常简单,不是吗?

恢复:飞镖中所有需要等待一段时间才能完成的事情称为“未来”。要等待将来的结果填充变量,请使用await或然后。因为Dart是单线程的,所以用于从Future中获取结果的异步方法(先等待,然后等待)在主线程上执行。如果要在新线程上运行任何功能,则可以创建隔离。 Dart提供了一个易于使用的隔离包装,称为“ compute”,您只需要传递将要处理的一种方法和将要处理的数据,将来它将为您返回所有结果。

  • 注意:如果要使用计算,请确保使用的是静态方法或顶级方法(请参阅示例中使用的Database.fetch,这不是偶然的,如果需要调用Database()。fetch或创建它的实例,意味着它不是静态方法,将无法与隔离方法一起使用。

英语不是我的第一语言,因此我不想写太多东西,但是我希望我能帮助区分多线程异步编程和单线程异步编程。

© www.soinside.com 2019 - 2024. All rights reserved.