0

Parallel.Foreach に少し問題があります。抽象クラスといくつかの派生クラスがあります。それらの 1 つは、ActiveX 要素 (webbrowser) を呼び出します。このオブジェクトをスレッドセーフにしたいのですが、うまくいきません:

Parallel.ForEach(stringarray, currentfile =>
{
    // When we have something, set the thread to STA
    // So we can call a WebBrowser
    if (currentfile.Contains("something"))
        Thread.CurrentThread.SetApartmentState(ApartmentState.STA);

    // Here is the part where the WebBrowser is called
    // But it fails and the debugger says that
    // Thread.CurrentThread.ApartmentState is MTA, but the condition above
    // is true  
    obj track = IService.Create(currentfile);

    if (track != null)
    {
        lock(my_list)
            my_list.Add(track);
    }
}
4

2 に答える 2

1

SetApartmentStateは、スレッドが開始される前にのみ機能します。

すでに実行中のスレッドでMTAをSTAに変更することはできません(これは明らかに当てはまりますCurrentThread)。

于 2012-12-11T23:21:59.223 に答える
0

おそらく、作業を行うために新しいスレッドをスピンアップする必要があると思います。おそらく、スレッドごとに個別の Web ブラウザーも作成する必要があります。これは、Web ブラウザだけではややこしいかもしれません。WebClient やその他の方法で Web リクエストを作成することを検討してください。

于 2012-12-11T23:41:01.890 に答える