【问题标题】:Update progress bar from Task.Run async从 Task.Run async 更新进度条
【发布时间】:2017-08-23 00:56:15
【问题描述】:

我有一种从用户信息生成软件激活密钥的方法:

private async void GenerateAsync()
        {
            await Task.Run(() =>
            {
                var secretstring = "CustomerName >> " + txtFullname.Text + " >> " + txtproducid.Text;
                keymng = new KeyManager(secretstring);
                var dateexp = numExpdate.Value;
                if (dateexp == 0)
                {
                    dateexp = 730000;
                }

                if (cbLicenseType.SelectedIndex == 0)
                {
                    kvc = new KeyValueClass()
                    {
                        LicenseType = LicenseType.FULL,
                        Header = Convert.ToByte(9),
                        Footer = Convert.ToByte(6),
                        ProductCode = PRODUCTCODE,
                        Edition = (Edition)Enum.Parse(typeof(Edition), cbEdition.SelectedText),
                        Version = 1,
                        Expiration = DateTime.Now.AddDays(Convert.ToInt32(dateexp))
                    };

                    if (!keymng.GenerateKey(kvc, ref productkey))
                    {
                        //Handling Error
                    }
                }
                else
                {
                    kvc = new KeyValueClass()
                    {
                        LicenseType = LicenseType.TRIAL,
                        Header = Convert.ToByte(9),
                        Footer = Convert.ToByte(6),
                        ProductCode = PRODUCTCODE,
                        Edition = (Edition)Enum.Parse(typeof(Edition), cbEdition.SelectedText),
                        Version = 1,
                        Expiration = DateTime.Now.AddDays(Convert.ToInt32(dateexp))
                    };
                    if (!keymng.GenerateKey(kvc, ref productkey))
                    {
                        //Handling Error
                    }
                }
            });

        }

我有进度条。我想异步运行此方法并将进度更新到进度条。如何使用 async-await 方法更新 UI。 BackgroundWorker 是替代品???

【问题讨论】:

    标签: c# winforms asynchronous async-await


    【解决方案1】:

    您应该使用更现代的IProgress<T>/Progress<T> 类型:

    var progress = new Progress<int>(value => { progressBar.Value = value; });
    await Task.Run(() => GenerateAsync(progress));
    
    void GenerateAsync(IProgress<int> progress)
    {
      ...
      progress?.Report(13);
      ...
    }
    

    这比 Invoke 更好,因为它不会将您的业务逻辑 (GenerateAsync) 绑定到特定 UI 或任何 UI。

    【讨论】:

      【解决方案2】:

      我在 Winforms 中使用这个方法:

      progressBar1.Invoke((Action)(() => progressBar1.Value=50))
      

      【讨论】:

      • 很好的答案,但我不确定您是否需要将其转换为动作。应该可以像这样progressBar1.Invoke(() =&gt; { progressBar1.Value = 50 });
      • @Nico Cool,我会尝试不使用演员表
      • 不错的答案!我试试看。
      • 如果不可能,请告诉我@BaliC :) 很久没有使用 c# 了。
      猜你喜欢
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2020-11-05
      • 1970-01-01
      • 2014-04-09
      相关资源
      最近更新 更多