1

我用主要形式和另一种显示进度的形式开发多线程应用程序。起初:我在 MainForm 中创建 ProgressForm

Progress p=new Progress();

第二:我创建类模型的新实例(我的应用程序中的所有数据)。

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);
                    }
                }
            }

我的问题是:为什么进度表不显示在主线程中?如何在没有锁定的情况下运行它?

4

2 回答 2

3

所有 UI 操作都必须在主 UI 线程上运行。

OnCopyStarted方法正在另一个线程上调用,因此在显示对话框之前必须切换到 UI 线程。

您可以使用表单的 BeginInvoke 切换到 UI 线程。如:

void OnCopyStarted(object sender, EventArgs e)
{
   p.BeginInvoke((Action) (() => p.Show()));
}
于 2012-11-06T06:00:26.710 回答
2

试试看 :

var t = new Thread(() => {
            Application.Run(new Progress ());
        });
t.Start();
于 2012-11-06T05:40:15.767 回答