我需要在打开文件时显示进度对话框,这是一项耗时的操作。为此,我在我的打开文件函数中使用了以下内容:
//some code
...
...
...
bool done = false;
//Show progress in a separate thread.
System.Threading.ThreadPool.QueueUserWorkItem((x) =>
{
using (var progressDialog = new ProgressDialog())
{
progressDialog.TopMost = true;
progressDialog.Show();
while (!done)
{
if(progressDialog.Message != this.strProgressMsg)
progressDialog.Message = this.strProgressMsg;
Application.DoEvents();
}
progressDialog.Close();
}
});
....
....
done = true;
....
....
问题:进度条对话框有时会出现,有时不会。我的文件打开功能在主线程中运行。有人可以指出我正确的检测方法,说明为什么会发生这种情况吗?
你把这个倒过来了。它应该是这样工作的:
- 分离一个线程来打开文件,并使用
progressDialog.Invoke()
让它回调到主线程以执行 GUI 更新。 (它不应该设置 strProgressMsg
并等待其他东西注意到变化——让它直接将更新发送到对话框。)
- 从主线程以模态方式显示进度对话框。
所以像这样:
using (var progressDialog = new ProgressDialog()) {
progressDialog.TopMost = true;
System.Threading.ThreadPool.QueueUserWorkItem((x) =>
{
try {
// this represents whatever loop you use to load the file
while (...) {
// do some work loading the file
// update the status
progressDialog.Invoke(new MethodInvoker(
() => progressDialog.Message = "Hello, World!"));
}
} finally {
// done working
progressDialog.Invoke(new MethodInvoker(progressDialog.Close));
}
});
// this will block until the thread closes the dialog
progressDialog.ShowDialog();
}
我是一名优秀的程序员,十分优秀!