c# - 显示 FolderbrowserDialog 后不会触发某些事件

标签 c# .net winforms

在 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 上,我得到了这个:

Normal behavior

在我遇到问题的机器上,BackgroundWorker 没有运行,因为 DoWork 事件从未被触发:

Problem

如果在代码中删除以下行,worker 将在所有机器上按预期运行。

folderbrowserDialog.ShowDialog();

附加信息

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

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

最佳答案

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

关于c# - 显示 FolderbrowserDialog 后不会触发某些事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9214383/

相关文章:

.net - 如何在我的 ASP.net 应用程序中启用数据库日志记录

.net - WCF UriTemplate 不会匹配带有斜杠(/)的单个字符串参数

c# - 圆形按钮

.net - 防止 WebBrowser 控件吞下异常

c# - 在两个组的 ListView 中显示单列

c# - 使用 C# 和 FiddlerCore 收听特定应用程序

c# - 想要在文本 block 中显示 slider 的值?

c# - 为什么即使我的类型实现了 IDisposable,Using 语句也会出错?

.net - 框架和体系结构有什么区别?

c# - Listview.count - InvalidArgument= '0' 的值对于“索引”无效