Parallel.ForEach和ActiveX

时间:2012-12-11 23:17:27

标签: c# multithreading user-interface activexobject

我对Parallel.Foreach有一点问题: 我有一个抽象类和一些派生类。其中一个调用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);
    }
}

2 个答案:

答案 0 :(得分:1)

SetApartmentState仅在线程启动之前工作。

您无法在已经运行的线程上将MTA更改为STA(CurrentThread显然是这样)。

答案 1 :(得分:0)

我认为你可能不得不做一些事情来启动新线程来完成工作。您可能还必须为每个线程创建单独的Web浏览器。对于Web浏览器而言,这可能会变得多毛。您可以考虑使用WebClient或其他方式来发出Web请求。