在 C# Caliburn Micro WPF 中异步和等待获取 HttpRequest 时更新 ProgressBar
Posted
技术标签:
【中文标题】在 C# Caliburn Micro WPF 中异步和等待获取 HttpRequest 时更新 ProgressBar【英文标题】:Updating ProgressBar while Async and Await fetching HttpRequest in C# Caliburn Micro WPF 【发布时间】:2020-11-25 10:05:41 【问题描述】:我希望在从 HttpGet Request 下载字符串时更新进度条状态。 在 Screen 类的 OnActivate 方法中获取数据时,进度没有更新。
这是我的屏幕代码。
public class LoadingAccountInfoViewModel:Screen, INotifyPropertyChanged
private readonly IEventAggregator _eventAggregator;
// Loading Progrss Bar...
private int loadingAccountInfoProgressBar;
public int LoadingAccountInfoProgressBar
get return loadingAccountInfoProgressBar;
set
if (loadingAccountInfoProgressBar == value)
return;
loadingAccountInfoProgressBar = value;
NotifyOfPropertyChange(() => LoadingAccountInfoProgressBar);
public LoadingAccountInfoViewModel(IEventAggregator eventAggregator)
_eventAggregator = eventAggregator;
protected async override void OnInitialize()
await Task.Factory.StartNew(() =>
loadingAccountInfoProgressBar = 2;
for (int i = 0; i < 5; i++)
loadingAccountInfoProgressBar += 10;
, TaskCreationOptions.AttachedToParent);
protected override async void OnActivate()
base.OnActivate();
User currentUser = Global.currentUser;
XCService xcService = new XCService();
LiveStream[] liveStreams = await xcService.GetLiveStreams(currentUser.username, currentUser.password, "get_live_streams");
VodStream[] vodStreams = await xcService.GetVodStreams(currentUser.username, currentUser.password, "get_vod_streams");
SerieStream[] serieStreams = await xcService.GetSerieStreams(currentUser.username, currentUser.password, "get_series");
// loadingAccountInfoProgressBar += 10;
_eventAggregator.PublishOnUIThread(new LoadingInfoDoneMessage());
protected override void OnDeactivate(bool close)
base.OnDeactivate(close);
关于这个类的UserControl的xaml是这样的:
<UserControl x:Class="ProIPTV.Pages.Content.Views.LoadingAccountInfoView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ProIPTV.Pages.Content.Views"
mc:Ignorable="d" >
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel >
<Image Source="logo.png" Height="59" />
<TextBlock Text="s t r i m o" FontSize="68" TextAlignment="Center" Foreground="#808182" Margin="0,0,0,188" />
<TextBlock Text="LOADING ACCOUNT" FontSize="30" Foreground="#808182" TextAlignment="Center" Margin="0,0,0,62.5"/>
<ProgressBar x:Name="LoadingAccountInfoProgressBar" Value="Binding Path=LoadingAccountInfoProgressBar" Style="DynamicResource CornerProgressBar" Height="12" Width="592" Foreground="#80F5F5F5"/>
</StackPanel>
</Grid>
</UserControl>
我确实在 OnActivate 方法中使用 HttpGetRequest 获取数据。
而ProgressBar状态更新在OnInitialize()方法中。
请帮助我在获取数据时修复更新进度条报告。
我是 Caliburn Micro WPF MVVM 的新手。所以请指导我如何解决。
【问题讨论】:
通常你应该从其他地方获得进度。在这种情况下,它不会更新 GUI。要更新 GUI,请像这样更改代码:Task.Delay(120); loadingAccountInfoProgressBar += 10; 这将是一个临时的。解决方案。你可以改变你的方法 我不确定您是如何更新“进度”的。您只是在一个奇怪的短循环中将进度值从 2 增加到 52。你到底想达到什么目的? 您为什么将Task.Factory.StartNew
与TaskCreationOptions.AttachedToParent
与async-await
结合使用?
@JinYongYoo1994:你为什么不在你执行实际工作的OnActivate()
方法中设置进度? OnInitialize()
...中的for
循环的目的是什么?
【参考方案1】:
当我调用异步函数时,我使用了 IProgress 并将 IProgress 状态作为参数发送。
您可以在@TimCorey 的视频中获得最佳解决方案。
这是链接。 Asyncronize Downloading with ProgressBar Updating
希望对你有帮助。
【讨论】:
以上是关于在 C# Caliburn Micro WPF 中异步和等待获取 HttpRequest 时更新 ProgressBar的主要内容,如果未能解决你的问题,请参考以下文章
使用 caliburn.micro wpf c# 更改视图名称
C# WPF MVVM开发框架Caliburn.Micro自定义引导程序④
C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面
在 C# Caliburn Micro WPF 中异步和等待获取 HttpRequest 时更新 ProgressBar