【问题标题】:Run ProgressBar only while thread runs仅在线程运行时运行 ProgressBar
【发布时间】:2020-02-10 16:34:10
【问题描述】:

只要线程正在运行一个名为 getAll() 的方法,我就会尝试增加 ProgressBar:

Thread thread = new Thread(new ThreadStart(getAll));
thread.Start();
pbStatus.Visibility = Visibility.Visible;
if (thread.IsAlive)
    pbStatus.Value++;
else 
    pbStatus.Visibility = Visibility.Hidden;

我的 ProgressBar xaml:

<ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" />

如果我启动getAll,ProgressBar 会出现,但如果方法完成则不会隐藏。

我尝试使用将进度条设置thread.isAlive 隐藏到false,但似乎没有什么区别。

我的问题是,我不知道getAll 运行了多长时间以及我回来做一些“进展”的时间,所以我认为检查线程是否仍在运行是个好主意增加我的ProgressBar 只要它运行?

【问题讨论】:

  • 您尝试过使用BackgroundWorker 吗?另外,你为什么不使用async Task,而是直接使用Thread
  • 嗨 Manoj,我正在使用 async Task。谢谢

标签: c# wpf multithreading


【解决方案1】:

您也可以使用以下解决方案。我强烈建议使用Task 而不是Thread

线程是一个较低级别的概念:如果你直接启动一个线程,你知道它将是一个单独的线程,而不是在线程池等上执行。

任务不仅仅是“在哪里运行一些代码”的抽象——它实际上只是“对未来结果的承诺”。

所以一般来说,建议尽可能使用更高级别的抽象。

private async void OnSomeEvent(..)
{
    pbStatus.IsIndeterminate = true;  // maybe show it
    var result = await GetAll();
    pbStatus.IsIndeterminate = false; // Maybe hide it

    // TODO: Do something with result
}


private async Task<Results> GetAll()
{
    // some code
}

【讨论】:

    【解决方案2】:

    使用BackgroundWorker不是更好吗?这是您使用 BackgroundWorker 的代码

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += worker_DoWork;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        worker.ProgressChanged += worker_ProgressChanged;
    
        pbStatus.Visibility = Visibility.Visible;
        worker.RunWorkerAsync();
    }
    
    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
    
        getAll();
        //for (int i = 0; i < 100; i++)
        //{
        //    (sender as BackgroundWorker).ReportProgress(i);
        //    Thread.Sleep(100);
        //}
    }
    
    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        pbStatus.Visibility = Visibility.Hidden;
    
    }
    
    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        pbStatus.Value = e.ProgressPercentage;
    }
    

    您的 ProgressBar xaml:

    <ProgressBar Name="pbStatus" Grid.Row="1" Minimum="0" Maximum="100" Height="10" Visibility="Hidden" />
    

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 2018-10-01
      • 2013-01-27
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      相关资源
      最近更新 更多