2009-03-26 23 views
0

私は、非同期操作を組み込んだアプリケーションを作成して、多数の項目をループし、各項目の計算時間を長くします。ユーザー入力用のモーダルダイアログをポップアップします。面白いことに、私は今日、このアプリケーションを実行している間に、モーダルダイアログが何らかの形で親フォームを取得していることに気付きました。アプリケーションにモーダルブロックを提供するのではなく、ダイアログがDigsbyチャットウィンドウを親として取得しました。C#フォームアプリケーション - モーダルダイアログに間違った親があります

Digsbyウィンドウが完全にブロックされたため、最初のダイアログと同じ時間にポップアップされたDigsbyウィンドウが作成されました(おそらくまったく同じ時刻です)。非同期操作が完了しました。どのようにプロセス単位のスレッドが機能するかを考えると、これがどのように可能かはわかりませんが、確かに起こりました。このようなバグの原因は何ですか?アプリケーションはC#.NET 3.5で、Windows XP上で実行されるWindowsフォームがあります。

はここで一言で言えば、非同期コードです:あなたはProgressBarアップデートを起動しているのと同じように

Action<List<ClubListing>> a = delegate(List<ClubListing> list) 
     { 
      for (int i = 0; i < list.Count; i++) 
      { 
       var cl = list[i]; 
       if (cl.MatchingClubListing == null) 
       { 
        var compare = CompareNames(cl.Club.Name); 
        if (compare.Any(c => c.Value == 0 && c.Key.Club.State == cl.Club.State)) 
        { 
         var match = compare.First(c => c.Value == 0 && c.Key.Club.State == cl.Club.State); 
         compareDialog.ClubA = cl.Club; 
         compareDialog.ClubB = match.Key.Club; 
         DialogResult dr = compareDialog.ShowDialog(); 
         if (dr == DialogResult.Yes) 
         { 
          cl.MatchingClubListing = match.Key; 
          match.Key.MatchingClubListing = cl; 
         } 
         else if (dr == DialogResult.Abort) 
         { 
          break; 
         } 
        } 
       } 
       this.Invoke(new MethodInvoker(delegate() 
       { 
        this.prbOperationProgress.Value = i; 
       })); 
      } 
     }; 

     AsyncCallback callback = new AsyncCallback(SaveAndUpdate); 
     var result = a.BeginInvoke(this.lbxLiveClubs.Items.Cast<ClubListing>().ToList(), callback, null); 

答えて

0

、あなたのダイアログの上映をInvoke()する必要があります。

3

compareDialog.ShowDialog()の引数として親ダイアログを追加します。例:

Form parent = ...; 
compareDialog.ShowDialog(parent); 
+0

これは、引数がないShowDialog()のドキュメントでは、「現在アクティブなウィンドウはダイアログボックスの所有者になります。特定の所有者を指定する場合は、この方法のもう一つのバージョンです。 http://msdn.microsoft.com/en-us/library/c7ykbedk.aspxを参照してください。 –

0

ワーカースレッドで比較ダイアログを表示しているようです。 Invokeへの呼び出しを使用してダイアログを表示しても問題ありません。

関連する問題