2015-06-20 107 views
-1

我需要在后台工程中运行一个耗时的过程,并且在那个过程中我也需要打开一个窗体。所有的工作都很好,但是当我在这个过程中调用一个UI时,它不允许我在新窗口中工作,它只是显示等待,当我取消BackgroundWorker过程时,它不会取消,尽管我启用了workersupportcancel。这里是我的代码如何在c backgroundworker中打开另一个窗体窗体#

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     runCheck();  
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
      MessageBox.Show(e.Error.Message); 
     }   
    } 
    private void newBtncheck_Click(object sender, RibbonControlEventArgs e) 
    { 
     backgroundWorker1.RunWorkerAsync(); 
    }  

private void newBtncheck_Click(object sender, RibbonControlEventArgs e) 
    { 
     backgroundWorker1.RunWorkerAsync(); 
    } 
    private void btnStop_Click(object sender, RibbonControlEventArgs e) 
    { 
     this.backgroundWorker1.CancelAsync(); 
    } 
+1

你看这个问题? http://stackoverflow.com/questions/1111369/how-do-i-create-and-show-wpf-windows-on-separate-threads –

+0

@BillBerry我看到了,但它对我没有好处。我需要在同一个线程中打开另一个窗口。我使用基本的线程,但它不工作,然后我使用backgroundworker,它也创建问题 –

回答

1

您需要打包您的代码,在调用表单的BeginInvoke()中打开新窗体。

把这个在您的backgroundWorker1_DoWork()方法:

BeginInvoke(new Action(()=>{ 
    // place code to open new form here, for example new MyNewForm().Show() 
})); 

这是假设你的backgroundWorker1_DoWork()是你的主窗体类的成员。如果没有,你将需要明确指定主窗体的实例:mainFormInstance.BeginInovoke(...)

+0

我试过了,h1 = new IDesignSpecWord2007.UI_Forms.HierarchyView(ref Globals.ThisAddIn.Application,ref docm); h1.BeginInvoke(new Action(()=> {h1.Show();}));但它不起作用。窗口未打开 - –

+0

不,您必须从主窗体调用BeginInvoke,而不是从正在创建的新窗体调用。请重新阅读我的答案,最后提到这一点:...您将需要明确指定主窗体的实例:mainFormInstance.BeginInovoke(...) –

0

您可以使用Dispatcher问UI线程打开对话框:(从here

this.Dispatcher.BeginInvoke(new Action(() => ProgressDialog.ShowDialog())); 
相关问题