Multithreading 颤振多方法的多线程处理

Multithreading 颤振多方法的多线程处理,multithreading,flutter,dart,dart-isolates,Multithreading,Flutter,Dart,Dart Isolates,请问如何在dart中多线程处理一些函数 例如,我有16个未来函数 我想首先在第一个线程中执行此函数 await GetRoot(); //Future<void> 等待GetRoot()//将来 然后在第一个线程结束后我想在第二个线程中同时执行这些函数- await GetLocalRadio();//Future<void> await GetMusic();//Future<void> await GetTalk();//Future<

请问如何在dart中多线程处理一些函数 例如,我有16个未来函数 我想首先在第一个线程中执行此函数

await GetRoot(); //Future<void>
等待GetRoot()//将来
然后在第一个线程结束后我想在第二个线程中同时执行这些函数-

 await GetLocalRadio();//Future<void>
  await GetMusic();//Future<void>
  await GetTalk();//Future<void>
  await GetSports();//Future<void>
  await GetByLocation();//Future<void>
  await GetByLanguage();//Future<void>
  await GetPodcasts();//Future<void>
等待GetLocalRadio()//将来
等待音乐()//将来
等待GetTalk()//将来
等待获得运动()//将来
等待GetByLocation()//将来
等待GetByLanguage()//将来
等待GetPodcast()//将来
然后,在第二个线程完成后,我希望在下一个线程中同时执行这些线程

 await GetPodcasts2();//Future<void>
  await GetByLocation2();//Future<void>
等待GetPodcasts2()//将来
等待GetByLocation2()//将来
然后当第二个线程结束时我希望当第三个函数完成时,在新线程中同时执行这些函数

  await FillPdcasts();//Future<void>
  await FillLocalRadio();//Future<void>
  await FillMusic();//Future<void>
  await FillTalk();//Future<void>
  await FillSports();//Future<void>
  await FillByLocation();//Future<void>
等待FillPdcasts()//将来
等待FillLocalRadio()//将来
等待音乐//将来
等待FillTalk()//将来
等待体育运动//将来
等待FillByLocation()//将来
下面是我所有方法的简单内容

 Future<void> FillByLocation()
  async {
    for (var entry in xByLocation2) {
        final responseFinalByLocation2 = await http.Client().get(entry.split('^')[1], headers: {'Content-Type': 'application/json; charset=utf-8'});
        try{
          final FinalByLocation2final = allInfosFromJson(utf8.decode(responseFinalByLocation2.bodyBytes));
          for (int i = 0; i < FinalByLocation2final.body.length; i++) {
            for (int j = 0; j < FinalByLocation2final.body[i].children.length; j++) {
              if(FinalByLocation2final.body[i].children[j].text != null && FinalByLocation2final.body[i].children[j].image != null)
              {
                if(!xListFinalAllInfos.contains(FinalByLocation2final.body[i].children[j].text + "^" + FinalByLocation2final.body[i].children[j].subtext + "^" + FinalByLocation2final.body[i].children[j].nowPlayingId + "^" + FinalByLocation2final.body[i].children[j].currentTrack+ "^" + FinalByLocation2final.body[i].children[j].url+ "^" + FinalByLocation2final.body[i].children[j].image))
                  {
                    setState(() {
                      xListFinalAllInfos.add(FinalByLocation2final.body[i].children[j].text + "^" + FinalByLocation2final.body[i].children[j].subtext + "^" + FinalByLocation2final.body[i].children[j].nowPlayingId + "^" + FinalByLocation2final.body[i].children[j].currentTrack+ "^" + FinalByLocation2final.body[i].children[j].url+ "^" + FinalByLocation2final.body[i].children[j].image);
                      // ListFinalAllInfos.putIfAbsent(
                      //     FinalByLocation2final.body[i].children[j].text, () =>
                      // FinalByLocation2final.body[i].children[j].image );
                    });
                  }
              }
            }
          }
        }catch(e){}
      }
  }
Future FillByLocation()
异步的{
for(xByLocation2中的var条目){
final responseFinalByLocation2=wait http.Client().get(entry.split('^')[1],头:{'Content-Type':'application/json;charset=utf-8'});
试一试{
final FinalByLocation2final=AllInfo-FromJSON(utf8.decode(responseFinalByLocation2.bodyBytes));
对于(int i=0;i
//FinalByLocation2final.body[i].children[j].image);
});
}
}
}
}
}捕获(e){}
}
}
因为当我执行所有函数并等待所有函数时,这将需要大约30秒。
这是一段很长的时间,所以我需要将时间缩短到30秒以内。

这里不选择多线程。只要坚持异步即可

您所有的
wait
s都会使您的代码慢得多。您正在强制上一个函数在下一个函数启动之前完成。请同时调用它们,然后使用
Future.wait

等待GetRoot();
列表toWait=[];
toWait.add(GetLocalRadio());
toWait.add(GetMusic());
...
等待未来;
toWait.clear();
toWait.add(GetPodcasts2());
toWait.add(GetByLocation2());
等待未来;
toWait.clear();
toWait.add(FillPdcasts());
toWait.add(FillLocalRadio());
...
等待未来;
toWait.clear();

此外,您在这些函数中所做的工作也没有得到有效的实现。您正在等待每个http调用完成,然后再处理调用中的数据并开始下一个调用。这样可以提高效率

下面的代码使用
。然后
为每个网络调用注册回调,将未来存储到列表中,并使用
未来。在最后等待
,以确保它们在包装函数返回之前都已完成

Future FillByLocation()
异步的{
列表toWait=[];
for(xByLocation2中的var条目){
toWait.add(http.Client().get(entry.split('^')[1],头:{'Content-Type':'application/json;charset=utf-8'}){
试一试{
final FinalByLocation2final=AllInfo-FromJSON(utf8.decode(responseFinalByLocation2.bodyBytes));
对于(int i=0;i