シングルスレッドアパートメント-ActiveXコントロールをインスタンス化できません
-
07-07-2019 - |
質問
HTMLページで適用されたCSSスタイルに関する情報を取得する必要があります。 AxWebBrowserを使用し、IHTMLDOMNodeを繰り返しました。必要なすべてのデータを取得し、コードをアプリケーションに移動できます。問題は、この部分がバックグラウンドワーカー内で実行されており、コントロールをインスタンス化しようとしたときに例外が発生したことです。
AxWebBrowser browser = new AxWebBrowser();
ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated
because the current thread is not in a single-threaded apartment.
AxWebBrowser以外にこのオプションまたは他のオプションを解決する方法はありますか?
解決
実行中の問題は、ほとんどのバックグラウンドスレッド/ワーカーAPIがマルチスレッドアパートメント状態でスレッドを作成することです。エラーメッセージは、コントロールがスレッドをシングルスレッドアパートメントである必要があることを示しています。
この問題を回避するには、自分でスレッドを作成し、そのスレッドでSTAアパートメントの状態を指定します。
var t = new Thread(MyThreadStartMethod);
t.SetApartmentState(ApartmentState.STA);
t.Start();
他のヒント
先に進み、アプリケーションのメインエントリに[STAThread]を追加します。これは、COMスレッドモデルがシングルスレッドアパートメント(STA)であることを示しています
例:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new WebBrowser());
}
}
アプリケーションのメインエントリに [STAThread]
を使用してもエラーが発生する場合は、コントロールに対して Thread-Safe呼び出しを行う必要がある場合があります。以下のようなもの。同じ問題を抱える私の場合、次の解決策が有効でした!
Private void YourFunc(..)
{
if (this.InvokeRequired)
{
Invoke(new MethodInvoker(delegate()
{
// Call your method YourFunc(..);
}));
}
else
{
///
}
所属していません StackOverflow