使用backgroundWorker创建并显示progressBar - VS2013

时间:2016-04-29 10:59:37

标签: c# visual-c++ progress-bar backgroundworker

我想在我的应用的另一个主题中显示选框进度条。 这是我的代码:

bkgWorker->RunWorkerAsync();

private: System::Windows::Forms::ProgressBar^  progressBar;

private: System::Void bkgWorker_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
    progressBar = (gcnew System::Windows::Forms::ProgressBar());
    progressBar->Location = System::Drawing::Point(548, 349);
    progressBar->MarqueeAnimationSpeed = 15;
    progressBar->Name = L"progressBar";
    progressBar->Size = System::Drawing::Size(100, 23);
    progressBar->Style = System::Windows::Forms::ProgressBarStyle::Marquee;
    progressBar->TabIndex = 23;
    progressBar->Show();
}

private: System::Void bkgWorker_RunWorkerCompleted(System::Object^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
    progressBar->Hide();
}

没有错,但我没有在表单上看到进度条。 我究竟做错了什么 ? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

有更好的和更新的解决方案取代了旧的好背景工作者。 我建议你看看async await design. 阅读这篇文章:Reporting Progress from Async Tasks

代码看起来像这样:

public async void StartProcessingButton_Click(object sender, EventArgs e)
{
  // The Progress<T> constructor captures our UI context,
  //  so the lambda will be run on the UI thread.
  var progress = new Progress<int>(percent =>
  {
    textBox1.Text = percent + "%";
  });

  // DoProcessing is run on the thread pool.
  await Task.Run(() => DoProcessing(progress));
  textBox1.Text = "Done!";
}

public void DoProcessing(IProgress<int> progress)
{
  for (int i = 0; i != 100; ++i)
  {
    Thread.Sleep(100); // CPU-bound work
    if (progress != null)
      progress.Report(i);
  }
}