2012-02-09 21 views
4

C#アプリケーションでFolderBrowserDialogを使用すると、私は非常に奇妙な動作をします。 FolderBrowserDialogを表示した後、BackgroundWorkerのDoWorkイベントやFileSystemWatcherのRenamedイベントなど、一部のイベントはアプリケーションで発生しません。FolderbrowserDialogが表示された後でイベントが発生しない

この問題は、特定のコンピュータでのみ発生することに注意してください。この問題は、開発マシンや、問題が発生しているマシンと同じハードウェア(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]または[キャンセル]をクリックします。私のdevのPC上で

私はこれを取得:

私は問題DoWorkイベントが発生されることはありませんので、BackgroundWorkerのは実行されません取得マシンでNormal behavior

Problem

コードで次の行が削除された場合、ワーカーはすべてのマシンで期待どおりに実行されます。予想通り

folderbrowserDialog.ShowDialog(); 

私はOpenFileDialogでFolderbrowserDialogを交換した場合、追加情報

  • は、作業者が実行されます。だから、本当にFolderbrowserDialogコンポーネントにリンクされているようです...
  • 何週間か前、私は問題のあるマシンにVisual Studioをインストールしようとしました。アプリケーションは、デバッガから実行されたときにのみ期待どおりに実行されました。この問題は、デバッグなしで実行しているときに表示されました。
  • .NET FW 3.0と4.0に移行すると、ユーザーがWindowsにログインし、問題
  • を解決していない管理者がPCを交換
  • をpriviledgesあり

は、あなたが任意のアイデアを持っているという問題を解決していませんFolderbrowserDialogがこれを引き起こす可能性があることを説明するには?

+0

'backgroundWorker.RunWorkerAsync()'コールの前と後に別のtrace文を追加して開始するかどうかを調べ、 'ShowDialog()' *の結果を表示するかもしれません。 – SliverNinja

+0

はあなたのアプリケーションの主なメソッドで、[STAThread]に帰属しますか? – Digvijay

答えて

2

FolderDialogBrowser.ShowDialogはブロッキングコールです。 this SO postで提案されているように別のスレッドで実行する必要があります。ブロックコール(、つまり、バックグラウンドワーカーにデータを渡す予定)ですか?

+0

私はFolderBrowserDialogがモーダルであることを期待しています。 FolderBrowserDialogが表示された後に上記の2つのキャプチャを取得したことは言及せず、FolderBrowserDialogフォームで[OK]または[キャンセル]をクリックします。 – Damien

関連する問題