【问题标题】:Some events are not fired after FolderbrowserDialog is shown显示 FolderbrowserDialog 后某些事件不会触发
【发布时间】:2012-02-10 00:18:38
【问题描述】:

在 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 事件从未被触发:

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

folderbrowserDialog.ShowDialog();

其他信息

  • 如果我将 FolderbrowserDialog 替换为 OpenFileDialog,worker 将按预期运行。所以它似乎真的是链接到 FolderbrowserDialog 组件...
  • 几周前,我尝试在出现问题的计算机上安装 Visual Studio。应用程序仅在从调试器运行时才按预期运行。在不调试的情况下运行时出现问题。
  • 迁移到 .NET FW 3.0 和 4.0 并没有解决问题
  • 登录到 Windows 的用户具有管理员权限
  • 更换电脑没有解决问题

您有什么想法可以解释一下 FolderbrowserDialog 是如何导致这种情况的吗?

【问题讨论】:

  • 您应该在backgroundWorker.RunWorkerAsync()调用之前和之后添加另一个跟踪语句,以查看它是否启动并返回(可能显示ShowDialog()的结果)。
  • 是您的应用程序的主要方法归因于 [STAThread]?

标签: c# .net winforms


【解决方案1】:

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

【讨论】:

  • 我希望 FolderBrowserDialog 是模态的。我没有提到在显示 FolderBrowserDialog 之后我得到了上面的 2 个捕获,我在 FolderBrowserDialog 表单上单击确定或取消。
猜你喜欢
  • 2023-01-30
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
相关资源
最近更新 更多