从另一个线程在主线程中显示表单

时间:2012-11-06 05:31:22

标签: c# .net multithreading

我用主窗体和另一种显示进度的形式开发多线程应用程序。 首先:我在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表单不在主线程中显示?如何在没有锁定的情况下运行它?

2 个答案:

答案 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()));
}