在 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.StartNewTaskCreationOptions.AttachedToParentasync-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

C# WPF MVVM开发框架Caliburn.Micro常用功能指南②

C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①