2014-01-26 27 views
0

我想创建一个可以在任何地方使用的,运行后台工作进程的类,如果正在运行,将会打开一个模态窗体,显示它的进度和其他形式不可用,但难以解决。以为我可以做到以下几点,但似乎并不奏效。任何其他想法?C#在后台工作人员的类中打开模态窗体

我可能会完全绕了错误的方式,但这里是我砍下代码:

public partial class Main : Form 
{ 
    public Main() 
    { 
     // load the database 
     Database.Load(this); 

     InitializeComponent(); 
    } 
} 

namespace Blah.Common 
{ 
public static class Database 
{ 
    private static Progress progressForm = new Progress(); 
    public static void Load(Form parentForm) 
    { 
     bw.WorkerReportsProgress = true; 
     bw.WorkerSupportsCancellation = true; 

     bw.DoWork += (obj, e) => bw_DoWork(parentForm); 
     bw.RunWorkerAsync(); 
    } 

    private static void bw_DoWork(Form parentForm) 
    { 
     progressForm.ShowDialog(parentForm); 
     progressForm.UpdateLabel("Loading..."); 

     doHeavyProcess(); 
     progressForm.Dispose() 
    } 
} 
} 

回答

1

的ShowDialog()是一个阻塞调用,BGW将无法继续运行,直到您关闭对话框。

在工作线程上显示UI是总是对您的程序造成长期持续影响的错误会使其在very undiagnosable way中随机挂起。在RunWorkerAsync()调用之后,您必须在UI线程中创建进度对话框。使用ProgressChanged事件更新它。

+0

当然!我试图把showdialog放在bw的东西之前,它显然失败了,因为它不得不等待我关闭它才能继续。我没有想到在RunWorkerAsync之后放置它。 如果我在bw_RunWorkerCompleted中关闭了表单,那么其他一切都会继续。 –