在C#应用程序中使用FolderBrowserDialog时,我有一种非常奇怪的行为。显示FolderBrowserDialog后,某些事件将不会在应用程序中触发,例如BackgroundWorker的DoWork事件或FileSystemWatcher的重命名事件。
请注意,此问题仅发生在特定计算机上。在我的开发机器上,以及在出现问题的机器上具有相同硬件(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表单上单击OK或Cancel。
在我的开发PC上我得到了这个:
在我遇到问题的机器上,BackgroundWorker无法运行,因为DoWork事件永远不会被触发:
如果在代码中删除了以下行,则工作程序将在所有计算机上按预期运行。
folderbrowserDialog.ShowDialog();
其他信息
您是否有任何想法可以解释FolderbrowserDialog如何导致此问题?
答案 0 :(得分:2)
FolderDialogBrowser.ShowDialog是一个阻止通话。您需要按照this SO post中的建议在单独的线程上运行它。你是否期望它是一个阻塞调用(即它应该将数据传递给后台工作者)?