在 C# 应用程序中使用 FolderBrowserDialog 时,我有一个非常奇怪的行为。显示 FolderBrowserDialog 后,某些事件不会在应用程序中触发,例如 BackgroundWorker 的 DoWork 事件或 FileSystemWatcher 的 Renamed 事件。
请注意,此问题仅发生在特定机器上。该问题不会出现在我的开发机器上,也不会出现在与出现问题的机器具有相同硬件(Xeon W3550 CPU)的许多其他生产机器上。应用程序运行的所有机器都在 Windows XP SP3 下。
我设法在一个非常简单的应用程序中隔离了问题。代码如下所示:
public partial class Form1 : Form
{
BackgroundWorker backgroundWorker;
public Form1()
{
InitializeComponent();
listBox1.Items.Add("Initialization");
backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
}
private void Form1_Load(object sender, EventArgs e)
{
listBox1.Items.Add("Running worker");
FolderBrowserDialog folderbrowserDialog = new FolderBrowserDialog();
folderbrowserDialog.ShowDialog(); // If this line is removed, the worker runs as expected
backgroundWorker.RunWorkerAsync();
}
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 5; i++)
{
backgroundWorker.ReportProgress(i * 20);
Thread.Sleep(1000);
}
}
void backgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
listBox1.Items.Add("Worker completed");
}
void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
listBox1.Items.Add("Task progress: " + e.ProgressPercentage.ToString());
}
我运行该应用程序并在显示 FolderBrowserDialog 后获得下面的 2 个捕获,然后我在 FolderBrowserDialog 表单上单击“确定”或“取消”。
在我的开发 PC 上,我得到了这个:
在我遇到问题的机器上,BackgroundWorker 没有运行,因为 DoWork 事件从未被触发:
如果在代码中删除以下行,worker 将在所有机器上按预期运行。
folderbrowserDialog.ShowDialog();
附加信息
- 如果我将 FolderbrowserDialog 替换为 OpenFileDialog,工作程序将按预期运行。所以它似乎真的链接到 FolderbrowserDialog 组件...
- 几周前,我尝试在出现问题的机器上安装 Visual Studio。应用程序仅在从调试器运行时才按预期运行。问题是在没有调试的情况下运行时出现的。
- 迁移到 .NET FW 3.0 和 4.0 没有解决问题
- 登录到 Windows 的用户具有管理员权限
- 更换 PC 没有解决问题
您有什么想法可以解释 FolderbrowserDialog 是如何导致这种情况的吗?
最佳答案
FolderDialogBrowser.ShowDialog是一个阻塞调用。您需要按照 this SO post 中的建议在单独的线程上运行它.您是否希望它是一个阻塞调用(即它是否应该将数据传递给后台工作人员)?
关于c# - 显示 FolderbrowserDialog 后不会触发某些事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9214383/