实现backgroundworker以另一种形式显示进度条

时间:2015-07-22 08:08:01

标签: c# multithreading

我的主要表单是执行长时间操作。为了告诉用户应用程序正在处理而不是冻结,我想以另一种形式实现进度条。

如果您不在主线程上,似乎无法与控件进行交互。 我尝试按照以下链接中的建议实现后台工作,但没有成功。

http://perschluter.com/show-progress-dialog-during-long-process-c-sharp/

基于任务的异步模式

也是如此

How to update the GUI from another thread in C#?

我越来越接近成功,将进度条表单的调用封装在另一个线程中:

Form_Process f_p = new Form_Process();
Thread newWindowThread = new Thread(new ThreadStart(() =>
{
    // Create and show the Window

    f_p.ShowDialog();
    // Start the Dispatcher Processing
    System.Windows.Threading.Dispatcher.Run();
}));

// Set the apartment state
newWindowThread.SetApartmentState(ApartmentState.STA);
// Make the thread a background thread
newWindowThread.IsBackground = true;
// Start the thread
newWindowThread.Start();

f_p.label_Progression.Text = "Call to exe";
f_p.progressBar1.Value = 30;
f_p.Refresh();

但是当我在主线程中调用一个函数并尝试更新进度条时,逻辑上解除了跨线程异常。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您无法在不同线程的表单上设置控件属性。你需要一个调用来做到这一点。

在表单上创建一个函数:

public void SetProgressText(string value) {
     if (this.InvokeRequired) {
         Action<string> progressDelegate = this.SetProgressText;
         progressDelegate.Invoke(value);
     } else {
         label_Progression.Text = value;
     }
}

然后,而不是

f_p.label_Progression.Text = "Call to exe";

呼叫

f_p.SetProgressText("Call to exe");

进度条相同。您可以将所有调用放在一个函数中。