我的主要表单是执行长时间操作。为了告诉用户应用程序正在处理而不是冻结,我想以另一种形式实现进度条。
如果您不在主线程上,似乎无法与控件进行交互。 我尝试按照以下链接中的建议实现后台工作,但没有成功。
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();
但是当我在主线程中调用一个函数并尝试更新进度条时,逻辑上解除了跨线程异常。
我错过了什么吗?
答案 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");
进度条相同。您可以将所有调用放在一个函数中。