Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 颤振并行执行的多种异步方法_Asynchronous_Flutter_Async Await - Fatal编程技术网

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