Asynchronous 颤振并行执行的多种异步方法
我仍然在努力使用异步/等待模式,所以我在这里问您一些精确性 我很好地解释了异步/等待模式。我在这里发布了一个困扰我的例子:Asynchronous 颤振并行执行的多种异步方法,asynchronous,flutter,async-await,Asynchronous,Flutter,Async Await,我仍然在努力使用异步/等待模式,所以我在这里问您一些精确性 我很好地解释了异步/等待模式。我在这里发布了一个困扰我的例子: import 'dart:async'; Future<String> firstAsync() async { await Future<String>.delayed(const Duration(seconds: 2)); return "First!"; } Future<String> secondAsync() a
import 'dart:async';
Future<String> firstAsync() async {
await Future<String>.delayed(const Duration(seconds: 2));
return "First!";
}
Future<String> secondAsync() async {
await Future<String>.delayed(const Duration(seconds: 2));
return "Second!";
}
Future<String> thirdAsync() async {
await Future<String>.delayed(const Duration(seconds: 2));
return "Third!";
}
void main() async {
var f = await firstAsync();
print(f);
var s = await secondAsync();
print(s);
var t = await thirdAsync();
print(t);
print('done');
}
导入'dart:async';
Future firstAsync()异步{
等待未来。延迟(持续时间(秒:2));
返回“第一”;
}
Future secondAsync()异步{
等待未来。延迟(持续时间(秒:2));
返回“秒!”;
}
Future thirdAsync()异步{
等待未来。延迟(持续时间(秒:2));
返回“第三个!”;
}
void main()异步{
var f=await firstAsync();
印刷品(f);
var s=await secondAsync();
印刷品;
var t=等待第三次同步();
打印(t);
打印(“完成”);
}
在本例中,每个async
方法都被一个接一个地调用,因此主函数的执行时间是6秒(3 x 2秒)。然而,如果异步函数一个接一个地执行,我不明白异步函数有什么意义
async
函数不应该在后台执行吗?多个async
函数不是要用并行执行来固定流程吗
我想我遗漏了一些关于颤振中异步函数和异步/等待模式的信息,所以如果您能解释一下,我将不胜感激
最好使用
async
/wait
,这样在执行下一个任务之前需要资源时非常有用
在您的示例中,您并没有做真正有用的事情,但假设您调用firstAsync
,这会在手机中为您提供一个存储的授权令牌,然后调用secondAsync
以异步方式提供该令牌并执行HTTP请求,然后检查该请求的结果。在这种情况下,您不会阻止UI线程(用户可以与您的应用程序交互)和其他任务(获取令牌、HTTP请求…)在后台完成。我想您没有理解颤振是如何工作的。首先颤振不是多线程的。。。。。! 第二,如果它不是多线程的,它怎么能执行并行任务,而这是不会发生的。。。。!这里有一些链接可以帮助你了解更多
Flatter不会将未来放在另一个线程上,但是如果它们被添加到队列中,会发生什么呢?我添加的链接是用于事件循环和未来如何工作的。希望您能理解,请随时问我:)如果您想要并行执行,您应该切换到称为隔离的多线程概念 将此与异步/等待概念混合使用。您还可以查看此网站了解更多信息
使用Future.wait()等待多个期货完成 如果函数的执行顺序不重要,可以使用Future.wait() 功能快速连续触发;当所有这些都使用一个值完成时,Future.wait()返回一个新的Future。这个未来将在包含每个函数生成的值的列表中完成
Future
.wait([firstAsync(), secondAsync(), thirdAsyncC()])
.then((List responses) => chooseBestResponse(responses))
.catchError((e) => handleError(e));
或者使用异步/等待
try {
List responses = await Future.wait([firstAsync(), secondAsync(), thirdAsyncC()]);
} catch (e) {
handleError(e)
}
如果调用的任何函数完成时出错,则Future.wait()返回的Future也将完成并出错。使用catchError()处理错误
参考资料:该示例旨在展示如何在不阻塞线程的情况下等待长时间运行的进程。在实践中,如果您有几个要并行运行的功能(例如:独立网络调用),您可以优化这些功能 调用
await
会在将来完成之前停止方法的执行,因此在firstAsync
完成之前不会调用secondAsync
,依此类推。如果您改为这样做:
void main() async {
var f = firstAsync();
var s = secondAsync();
var t = thirdAsync();
print(await f);
print(await s);
print(await t);
print('done');
}
然后所有三个期货都立即开始,然后你等待它们按照特定的顺序完成
值得强调的是,现在的
f
、s
和t
具有类型Future
。您可以为每个将来尝试不同的持续时间,或者更改语句的顺序。您可以在单个将来始终使用它们
final results = await Future.wait([
firstAsync();
secondAsync();
thirdAsync();
]);
结果将是您返回类型的数组。在本例中是字符串数组
干杯。键工作
等待
停止执行流,直到异步操作100%完成。如果你删除它,代码将“不停地”运行。我读了文档,它真的很有趣,我不知道。然而,我的问题是异步执行的意义是什么?例如,假设我想从服务器获取数据。我正在使用GET查询中的await
关键字创建一个async
方法。async
方法结束,GET查询在从事件循环中退出队列时执行。我知道这样做是为了避免冻结UI,但如果没有并行执行,则即使将来执行GET查询,也会阻止UI no?例如,我在GET查询期间运行CirclularProgressWheel,当GET查询从事件循环中取消时,它会被冻结吗?如果不是,这意味着查询是在另一个线程(在dart中隔离)的后台执行的,但这对开发人员来说是透明的吗?要在本机Android中与AsyncTask
并行,我认为一个ASyncTask
是在另一个线程中执行的,以避免冻结UI。不,您似乎没有注意到一些重要的细节,而且它也不是多线程的。但是,有两个队列,微任务处理短任务,它应该先完成,然后再转到事件队列,这是执行未来的地方添加。看这张图片,我会添加另一条关于android的评论,这样你可以联系更多在android中,你可以在主线程上添加一些任务,但ui不会冻结,因为它是如此小的任务,因此,这是一个相同的概念,有些任务不会在flutter中冻结ui,但是当这些任务太长并且会导致冻结时,我们使用future