在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上,我得到以下信息:



在出现问题的机器上,由于从未启动DoWork事件,因此BackgroundWorker无法运行:



如果代码中删除了以下行,则工作程序将在所有计算机上按预期运行。

folderbrowserDialog.ShowDialog();


附加信息


如果将FolderbrowserDialog替换为OpenFileDialog,则工作程序将按预期运行。因此,它似乎确实链接到FolderbrowserDialog组件...
几周前,我尝试在出现问题的计算机上安装Visual Studio。仅当从调试器运行时,应用程序才按预期运行。未经调试运行时出现问题。
迁移到.NET FW 3.0和4.0不能解决问题
登录到Windows的用户具有管理员权限
装回PC不能解决问题


您是否有任何想法来解释FolderbrowserDialog可能导致的原因?

最佳答案

FolderDialogBrowser.ShowDialog是阻止呼叫。您需要按照this SO post中的建议在单独的线程上运行它。您是否期望它是阻塞调用(即是否应该将数据传递给后台工作程序)?

09-07 00:21