我正在尝试创建一个可以在任何地方使用的类,它运行后台工作进程,如果正在运行,将打开一个模式表单,显示它的进度,其他表单不可用但很难处理它出。以为我可以做到以下几点,但似乎没有用。还有其他想法吗?
我可能会采用完全错误的方式,但这是我的缩减代码:
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()
}
}
}
答案 0 :(得分:1)
ShowDialog()是一个阻止调用,在关闭对话框之前,BGW将无法继续运行。
在工作线程上显示UI 始终错误,对您的程序产生长期影响,使其在very undiagnosable way中随机挂起。在RunWorkerAsync()调用之后,必须在UI线程中创建进度对话框。使用ProgressChanged事件更新它。