2017-08-12 7 views
0

警告が必要なときに、スレッド内のwebBrowserコントロール(メインスレッドではない)を持つ小さなポップアップフォームを開きたい。C#スレッド内にwebBrowserを持つフォームを作成する

ちょうど、スレッドのポップアップフォームを実行し、エラー

ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be 
instantiated 
because the current thread is not in a single-threaded apartment. 

だから、私はSTAモードでスレッドを設定しました、エラーは発生しません。しかし、複数のポップアップを実行する必要がある場合は、1つずつ表示されます。 2番目のポップアップは、最初のポップアップを閉じるまで表示されません。そうですね。 私はすべてのポップアップをスレッドで同時に表示したいと思います。

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Thread th = new Thread(() => 
    { 
     var arts = _Moniter.Mon(); 
     if (arts.Count < 1) return; 

     foreach (var art in arts) 
     { 
      var f = new FormPopup(art, FormPopup.POPUP_MODE.NORMAL, Color.Yellow, 30000); 
      Application.Run(f); 
     } 
    }); 
    th.SetApartmentState(ApartmentState.STA); // 
    th.IsBackground = true; // 
    th.Start(); 
} 

なしSTAスレッドでWebBrowserを持つフォームを表示する方法はありますか? または、STAスレッドで複数のフォームを同時に実行するにはどうすればよいですか?

+0

なぜ別のスレッドで実行しますか? 'f.Show();'で 'Applicatio.Run(f);'を置き換えて複数のフォームを同時に表示するのはなぜですか? –

+0

@PeterBons "f.Show();"を実行すると、すべてのポップアップフォームが表示された直後に閉じられます。だから、私はApplication.Run()を使用しました。私はちょうどモニターが働いている間、固まっていないUIをしたい。このジョブにはWeb解析の問題が含まれているためです。 – amplet7

答えて

0

私は偶然、問題を解決しました。ちょうど "メインフォーム"のInvoke()でポップアップフォームを作成して呼び出しました。 STAスレッドも使用する必要はありません。それはこれを行うことによって他の副作用を有する可能性がある。しかし、それは正常に動作しています。

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Thread th = new Thread(() => 
    { 
     foreach (var art in arts) 
     { 
      this.Invoke((MethodInvoker)(() => // It works! 
      { 
       var f = new FormPopup(art, FormPopup.POPUP_MODE.NORMAL, Color.Yellow, 30000); 
       f.Show(); 
      })); 
     } 
    }); 
    th.IsBackground = true; // 
    th.Start(); 
} 
関連する問題