我用主窗体和另一种显示进度的形式开发多线程应用程序。 首先:我在MainForm中创建ProgressForm
Progress p=new Progress();
第二:我创建了类Model的新实例(我应用中的所有数据)。
Model m = new Model();
订阅活动:
m.OperationStarted += new EventHandler(OnCopyStarted);
private void OnCopyStarted(object sender, EventArgs e)
{
p.Show();
}
第三:我在另一个线程中运行一些操作,我在另一个模型中更改了属性
private bool isStarted;
public bool IsStarted
{
get{return isStarted;}
set
{
isStarted = value;
if (isStarted && OperationStarted != null)
{
OperationStarted(this, EventArgs.Empty);
}
}
}
我的问题是:为什么Progress表单不在主线程中显示?如何在没有锁定的情况下运行它?
答案 0 :(得分:2)
试一试:
var t = new Thread(() => {
Application.Run(new Progress ());
});
t.Start();
答案 1 :(得分:2)
所有UI操作必须在主UI线程上运行。
正在另一个线程上调用OnCopyStarted
方法,因此它必须在显示对话框之前切换到UI线程。
您可以使用表单的BeginInvoke切换到UI线程。如:
void OnCopyStarted(object sender, EventArgs e)
{
p.BeginInvoke((Action) (() => p.Show()));
}