Некоторые события не запускаются после отображения FolderbrowserDialog - PullRequest
4 голосов
/ 09 февраля 2012

У меня очень странное поведение при использовании FolderBrowserDialog в приложении C #.После отображения FolderBrowserDialog некоторые события не будут запускаться в приложении, например, событие DoWork в BackgroundWorker или событие Renamed в FileSystemWatcher.

Обратите внимание, что эта проблема возникает только на определенных компьютерах.Проблема не возникает ни на моей машине разработки, ни на многих других производственных машинах, имеющих такое же оборудование (ЦП Xeon W3550), что и машины, на которых возникает проблема.Все машины, на которых работает приложение, находятся под 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.Dev PC Я получаю это:

Normal behavior

На машине, где я получаю проблему, BackgroundWorker не запускается, потому что событие DoWork никогда не запускается:

Problem

Если в коде удалена следующая строка, рабочий работает на всех машинах, как и ожидалось.

folderbrowserDialog.ShowDialog();

Дополнительная информация

  • Если я заменю FolderbrowserDialog на OpenFileDialog, рабочий будет работать как положено.Так что, похоже, он действительно связан с компонентом FolderbrowserDialog ...
  • Несколько недель назад я пытался установить Visual Studio на компьютер, на котором возникла проблема.Приложение запускалось, как и ожидалось, только при запуске из отладчика.Проблема возникла при запуске без отладки.
  • Миграция на .NET FW 3.0 и 4.0 не решила проблему
  • Пользователь, вошедший в Windows, имеет права администратора
  • ЗаменаПК не решил проблему

Не могли бы вы объяснить, как это может вызвать FolderbrowserDialog?

1 Ответ

2 голосов
/ 09 февраля 2012

FolderDialogBrowser.ShowDialog является блокирующим вызовом. Вам нужно запустить его в отдельном потоке, как предложено в этом SO сообщении . Вы ожидаете, что это будет блокирующий вызов (, т.е. он должен передавать данные фоновому рабочему )?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...