c# – 显示FolderbrowserDialog后不会触发某些事件
在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(); 附加信息 >如果我用OpenFileDialog替换FolderbrowserDialog,则工作程序按预期运行.所以它似乎真的链接到FolderbrowserDialog组件…… 您是否有任何想法可以解释FolderbrowserDialog如何导致这种情况? 解决方法
FolderDialogBrowser.ShowDialog是一个阻止通话.您需要在
this SO post中建议的单独线程上运行它.您是否期望它是一个阻塞调用(即它是否应该将数据传递给后台工作者)?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |