我正在为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本身获得最好的线索:
您只能在创建它的线程中操作实例。
发生了什么事?
答案 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);
}
}