并行处理工厂模式,从静态方法返回类的新实例

时间:2017-03-16 20:51:49

标签: c# multithreading parallel.foreach

我正在为dll编写一个包装器。我正在使用带有管理器类的工厂模式来进行配置。

public sealed class Manager {
    private static readonly factory = new Factory();

    //prevents the default instance from being instantiated
    private Manager(){}

    public static IFoo GetMyIFoo(IParam param) {
        return factory.GetMyIFoo(param);
    }
}

然后我的工厂处理实例化配置:

public class Factory {
    public IFoo GetMyIFoo(IParam param) {
        IFoo foo = new Foo(param);
        foo.SetConfiguration(this.Configuration, this);
        return foo;
    }
}

在我的平行预言中:

Parallel.ForEach(fooThings, (fooThing, state) => {
    using(var foo = Manager.GetMyIFoo(fooThing)) {
        foo.MyDllMethods(); //throws an error in parallel
    }
});

我的代码在vanilla foreach中正常工作,但在Parallel.ForEach下运行时我收到了AccessViolationException:

  

尝试读取或写入受保护的内存。这通常是一个   表明其他内存已损坏。

如果我使用F10逐步完成错误,我会从DLL本身获得最好的线索:

  

您只能在创建它的线程中操作实例。

发生了什么事?

1 个答案:

答案 0 :(得分:1)

正如我在评论中所述,foo.SetConfiguration(this.Configuration,this);我认为'这'是问题所在。您正在共享由一个线程与另一个线程创建的实例,因为您在管理器中有一个静态变量

public sealed class Manager
    {
        //prevents the default instance from being instantiated
        private Manager() { }

        public static IFoo GetMyIFoo(IParam param)
        {

            Factory factory = new Factory();
            return factory.GetMyIFoo(param);
        }
    }