如何将加载微调器连续用于两个异步任务
本文关键字:两个 任务 异步 用于 连续 加载 | 更新日期: 2023-09-27 18:34:23
目前我有两个独立的异步任务发出不同的Web请求。执行异步任务时,将显示加载微调器。现在我应该在第一个任务中添加第二个异步任务,其中第二个任务依赖于第一个。
我的主要问题是加载微调器,同时总结了两个异步调用。Hide(( 上有一个淡出动画,设置为 0.5 秒。因此,微调器在短时间内显示两次,看起来有点丑陋。如果我跳过动画,我会得到闪烁效果。
也许我错了,我应该转向正常的同步请求,但我不想阻止 UI 线程。我不知道我应该搜索什么。这是我目前要做的,是一个简化版本:
public async void showList()
{
List<Car> carList = new List<Car>();
carList = await GetCarListTask();
List<string> manufacturers = extractIDs(carList);
List<Manufacturer> manufacturerList = await GetManufacturerListTask(manufacturers);
Table.Show(carList, manufacturerList);
}
public async Task<List<Car>> GetCarListTask(){
LoadingOverlay loadingOverlay = new LoadingOverlay ();
List<Car> carList = new List<Car>();
try{
loadingOverlay.Show();
carList = await Task.Run(() => manager.GetCarList());
loadingOverlay.Hide();
return carList;
}
catch(Exception ex)
{
alert.Show("Something went wrong");
loadingOverlay.Hide();
}
return carList;
}
public async Task<List<Manufacturer>> GetManufacturerListTask(List<string> manufacturerID){
LoadingOverlay loadingOverlay = new LoadingOverlay ();
List<Manufacturer> manufacturerList = new List<Manufacturer>();
try{
loadingOverlay.Show();
manufacturerList = await Task.Run(() => manager.GetManufacturerList(manufacturerID));
loadingOverlay.Hide();
return manufacturerList;
}
catch(Exception ex)
{
alert.Show("Something went wrong");
loadingOverlay.Hide();
}
return manufacturerList;
}
如您所见,LoadOverlay(( 是为每个请求独立创建的,并且取决于当前视图。Show(( 实际上是 this.NavigationController.View.InsertSubviewBelow(loadingOverlay,this.NavigationController.NavigationBar)
的替代品,唯一的中心位置是 AppDelegate,但我认为它无法访问我使用的每个导航控制器(模态视图、弹出框......
我应该如何解决这个问题?
编辑:
目前我没有显示第二个加载微调器。如果用户比请求快,会发生什么会很有趣......那么我应该使第二个调用同步吗?
我想到的另一个选择是重新设计 LoadOverlay((,以使闪烁不会那么明显。不过,最好的解决方案是拥有一个加载类,该类始终显示加载微调器,直到所有连续的请求都已完成。但我不知道这样的集中式实例会是什么样子。一个简单的解决方案是将这两个调用汇总到一个方法中,但您必须了解返回类型。
我不明白为什么你不能只将显示/隐藏逻辑移动到调用方法:
public async Task ShowListsAsync()
{
LoadingOverlay loadingOverlay = new LoadingOverlay ();
loadingOverlay.Show();
try
{
List<Car> carList = await Task.Run(() => manager.GetCarList());
List<string> manufacturers = extractIDs(carList);
List<Manufacturer> manufacturerList = await Task.Run(() => manager.GetManufacturerList(manufacturers));
Table.Show(carList, manufacturerList);
}
catch
{
alert.Show("Something went wrong");
}
finally
{
loadingOverlay.Hide();
}
}
也许这个例子过于简单了,这是有原因的。
另外,作为旁注:
我有两个独立的异步任务发出不同的网络请求
Web 请求本质上是异步的。如果您使用的是类似 HttpClient
,从 manager
公开 GetCarList
/GetManufacturerList
的异步版本应该很简单。这将消除对Task.Run
的需求:
List<Car> carList = await manager.GetCarListAsync();
List<string> manufacturers = extractIDs(carList);
List<Manufacturer> manufacturerList = await manager.GetManufacturerListAsync(manufacturers);