gpt4 book ai didi

c# - Form.Show() 间歇性地在线程中显示表单

转载 作者:太空宇宙 更新时间:2023-11-03 19:31:39 27 4
gpt4 key购买 nike

我需要在打开文件时显示进度对话框,这是一项耗时的操作。为此,我在我的打开文件函数中使用了以下内容:

           //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;
....
....

问题:进度条对话框有时会出现,有时不会。我的文件打开功能在主线程中运行。有人可以指出我正确的检测方法,说明为什么会发生这种情况吗?

最佳答案

你把这个倒过来了。它应该是这样工作的:

  1. 分离一个线程来打开文件,并使用 progressDialog.Invoke() 让它回调到主线程以执行 GUI 更新。 (它不应该设置 strProgressMsg 并等待其他东西注意到变化——让它直接将更新发送到对话框。)
  2. 从主线程以模态方式显示进度对话框。

所以像这样:

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

关于c# - Form.Show() 间歇性地在线程中显示表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4515138/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com