ProgressBar值正在更改,但是gui在WPF上未更改

迈克尔·加贝(Michael Gabbay)

我正在尝试实现一个ProgressBar将在文件传输过程中显示的内容。

文件传输是通过进行的BackgroundWorker

只是为了检查我尝试从主线程取得进展的功能,没有任何反应。

编码:

myProgressBar.Minimum = 0;
myProgressBar.Maximum = numOfPackets;

这是后台工作人员代码...

然后:

myProgressBar.IsEnabled = true;

for (int i = 0; i < buff.Length; i++)
{
    myProgressBar.Value = i;
    myProgressBar.UpdateDefaultStyle();
}

为什么什么都没有改变?

不败

在后台线程上进行IO或文件传输是非常糟糕的,因为在文件传输或IO操作期间,CPU没有被使用,因此您的后台线程没有做任何事情,而是在等待IO竞争,并且您浪费了一个线程,这反过来又导致浪费另一个缺点是,即使您在后台线程上进行操作,UI也将无法响应文件传输,而这需要花费大量时间。

我可以继续编写在后台线程上进行IO工作的缺点,但是您应该索取一份有关在.Net中异步进行IO的文档。后台线程用于CPU密集型工作,例如涉及CPU的大量计算。

您应该使用异步IO。使用异步并等待。请阅读有关异步IO的信息。我有一个示例示例,说明您如何使用带有进度栏和响应式UI的纯异步IO进行操作。我明天再写。

**下面是异步io文件传输代码,假定所有文件的大小都相同,以进行进度更新上面提到的代码将起作用,即使在传输文件时移动窗口,应用程序也不会挂起。**

MainWindow.xaml

<Window x:Class="asyncawait.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="514" Width="674">
    <Grid Margin="0,0,0,4">
        <ScrollViewer Name="scrv_Log" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"  HorizontalAlignment="Left" Width="397" Margin="33,61,0,67">
            <ListBox VirtualizingPanel.VirtualizationMode="Recycling" ItemsSource="{Binding Datas,Mode=OneWay}" Background="White" Foreground="Red"/>
        </ScrollViewer>
        <TextBlock Height="40" Width="70" FontSize="10" Foreground="Green" Text="{Binding FileCounter,Mode=OneWay}" Margin="540,281,56,158"></TextBlock>
        <Button Foreground="Black" IsEnabled="{Binding IsButtonEnabled}" Click="Button_Click"  Height="40" Width="40" RenderTransformOrigin="4.65,0.425" Margin="540,210,86,229"></Button>
        <ProgressBar Value="{Binding Progressvalue,Mode=OneWay}"  Name="prg" Foreground="Green"  Height="20" Width="600" Margin="23,453,44.2,7"></ProgressBar>
        <Label Content="{Binding ElementName=prg,Path=Value}" ContentStringFormat="{}{0}%" Height="25" Margin="253,0,295.2,22"  VerticalContentAlignment="Center" VerticalAlignment="Bottom"/>
        <TextBox Background='AliceBlue' HorizontalAlignment="Left" Height="23" Margin="525,109,0,0" TextWrapping="Wrap"  VerticalAlignment="Top" Width="97"/>
    </Grid>
</Window>

****以下是执行异步IO的代码**

public partial class MainWindow: Window,INotifyPropertyChanged
    {

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
        }
        public double Progressvalue
        {
            get
            {
                return _Progressvalue;

            } 
            set
            {
                if(value!=_Progressvalue)
                {
                    _Progressvalue=value;
                    OnPropertyChanged();
                }
            }
         }
        private Double _Progressvalue=0;
        private bool _IsEnabled=true;

        public Boolean IsButtonEnabled { 
            get
            {
                return _IsEnabled;
             }

            set
            {
                if(value!=_IsEnabled)
                {
                    _IsEnabled = value;
                    OnPropertyChanged();
                }
            }
        }
        private async  void Button_Click(object sender, RoutedEventArgs e)
        {
            IsButtonEnabled = false;
            await AsyncTransferFiles();
            IsButtonEnabled = true;
            scrv_Log.ScrollToBottom();

        }

        private String fileCounter;
         public String FileCounter
        {
            get
            { return fileCounter; }
            set
            {
                if (value != fileCounter)
                {
                    fileCounter = value;
                    OnPropertyChanged();
                }
            }
        }







        private ObservableCollection<String> _Datas = new ObservableCollection<string>();
        public ObservableCollection<String> Datas
        {
            get
            {
                return _Datas;
            }
        }
         private async Task AsyncTransferFiles()
        {

            var fileNames = Directory.GetFiles("C:\\Data1").ToList();
            int totalCount = fileNames.Count;
            pr = (double)1 / totalCount;
            int counter = 0;
            var progress = new Progress<double>();
            progress.ProgressChanged += (sender, e) =>
                {

                   Progressvalue = Double.Parse(e.ToString());

                };
            foreach (var fileName in fileNames)
            {
                await (CopyFileAsync(fileName, "C:\\GradebookTemp1\\" + fileName.Split('\\')[2], progress, ++counter));
            }
        }



         double pr = 0.0;
         public async Task CopyFileAsync(string sourcePath, string destinationPath,IProgress<double> progress ,int fileCounter)
         {
             using (Stream source = File.Open(sourcePath,FileMode.Open))
             {
                 using (Stream destination = File.Create(destinationPath))
                 {
                     await source.CopyToAsync(destination);
                     progress.Report((int)(pr*fileCounter*100));
                     FileCounter = fileCounter.ToString();
                     Datas.Add("Copied File: " + sourcePath);
                     scrv_Log.ScrollToBottom();

                 }
             }

         }

        private void EnableButton()
        {
            IsButtonEnabled = true;
        }

        private void OnPropertyChanged([CallerMemberName] String propertyName=null)
        {
            var handler = PropertyChanged;
            if(null!=handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));

            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

UITableviewCell值正在更改

来自分类Dev

Raspberry Pi B + GPIO输入值正在更改而未连接

来自分类Dev

我正在更改javascript类的构造函数,但是未调用新的构造函数?

来自分类Dev

innerHTML正在更改输入的值

来自分类Dev

输入“值”正在更改输出

来自分类Dev

更改Android ProgressBar上的可绘制对象

来自分类Dev

如何获取 datagrid row.cells 值,我正在从 winforms 代码更改为 wpf?

来自分类Dev

select2显示未更新标签文本,但值正在更改

来自分类Dev

select2显示未更新标签文本,但值正在更改

来自分类Dev

我正在尝试使用指针通过函数更改结构中的值,但是在函数中输入地址时出现错误

来自分类Dev

XAMMP 上的 Favicon 未更改

来自分类Dev

继承的字段值未更改

来自分类Dev

继承的字段值未更改

来自分类Dev

为什么与转换器绑定会更改GUI上未绑定的属性?

来自分类Dev

ViewBag正在传递更改的值PartialView

来自分类Dev

Python函数正在更改传递参数的值

来自分类Dev

sprintf正在更改布尔值

来自分类Dev

在更改值上更改选择css

来自分类Dev

我正在尝试在 document.getElementById 上使用 if 语句,但它更改了值

来自分类Dev

如何更改ProgressBar颜色?

来自分类Dev

Android更改ProgressBar的厚度

来自分类Dev

图片在WPF控件中未更改

来自分类Dev

c#读取webbrowser中更改的Progressbar的值

来自分类Dev

我正在读取图像并进行更改。但是更改没有保存

来自分类Dev

WPF ProgressBar-绑定进度值以显示在栏上

来自分类Dev

WPF强制xaml重新获取属性的值,尽管属性的设置器未更改

来自分类Dev

WPF绑定:输入后源值未更改时,如何防止目标更新

来自分类Dev

我正在使用来自角度/材质的mat-tab,但是未显示标签。如何更改它以便显示我的标签?

来自分类Dev

更改矩形的X值实际上不会在GUI中移动它

Related 相关文章

  1. 1

    UITableviewCell值正在更改

  2. 2

    Raspberry Pi B + GPIO输入值正在更改而未连接

  3. 3

    我正在更改javascript类的构造函数,但是未调用新的构造函数?

  4. 4

    innerHTML正在更改输入的值

  5. 5

    输入“值”正在更改输出

  6. 6

    更改Android ProgressBar上的可绘制对象

  7. 7

    如何获取 datagrid row.cells 值,我正在从 winforms 代码更改为 wpf?

  8. 8

    select2显示未更新标签文本,但值正在更改

  9. 9

    select2显示未更新标签文本,但值正在更改

  10. 10

    我正在尝试使用指针通过函数更改结构中的值,但是在函数中输入地址时出现错误

  11. 11

    XAMMP 上的 Favicon 未更改

  12. 12

    继承的字段值未更改

  13. 13

    继承的字段值未更改

  14. 14

    为什么与转换器绑定会更改GUI上未绑定的属性?

  15. 15

    ViewBag正在传递更改的值PartialView

  16. 16

    Python函数正在更改传递参数的值

  17. 17

    sprintf正在更改布尔值

  18. 18

    在更改值上更改选择css

  19. 19

    我正在尝试在 document.getElementById 上使用 if 语句,但它更改了值

  20. 20

    如何更改ProgressBar颜色?

  21. 21

    Android更改ProgressBar的厚度

  22. 22

    图片在WPF控件中未更改

  23. 23

    c#读取webbrowser中更改的Progressbar的值

  24. 24

    我正在读取图像并进行更改。但是更改没有保存

  25. 25

    WPF ProgressBar-绑定进度值以显示在栏上

  26. 26

    WPF强制xaml重新获取属性的值,尽管属性的设置器未更改

  27. 27

    WPF绑定:输入后源值未更改时,如何防止目标更新

  28. 28

    我正在使用来自角度/材质的mat-tab,但是未显示标签。如何更改它以便显示我的标签?

  29. 29

    更改矩形的X值实际上不会在GUI中移动它

热门标签

归档