在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组件……
>几周前,我尝试在遇到问题的机器上安装Visual Studio.只有从调试器运行时,应用程序才会按预期运行.在没有调试的情况下运行它时出现问题.
>迁移到.NET FW 3.0和4.0无法解决问题
>登录Windows的用户具有管理员权限
>更换电脑并没有解决问题
您是否有任何想法可以解释FolderbrowserDialog如何导致这种情况?
解决方法
FolderDialogBrowser.ShowDialog是一个阻止通话.您需要在
this SO post中建议的单独线程上运行它.您是否期望它是一个阻塞调用(即它是否应该将数据传递给后台工作者)?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。