C# C+的并行调用+;用PInvoke包装的库引发System.AccessViolationException异常 我使用.pNoCKE技术从.NETFramework 4.61+C++ DLL()调用。

C# C+的并行调用+;用PInvoke包装的库引发System.AccessViolationException异常 我使用.pNoCKE技术从.NETFramework 4.61+C++ DLL()调用。,c#,c++,pinvoke,C#,C++,Pinvoke,以下C#代码: [DllImport(“CoolProp”,EntryPoint=“CSharp_PropsSI”)] 公共静态外部程序double-PropsSI(字符串输出,字符串名称1,double-Prop1,字符串名称2,double-Prop2,字符串引用); 包装库的一个主要函数的声明 在单线程环境中调用它时,一切正常。 当我尝试使用System.Threading.Tasks并行调用此外部函数时,出现了问题 [TestMethod] 公共异步任务TestAsyncMethod(

以下C#代码:

[DllImport(“CoolProp”,EntryPoint=“CSharp_PropsSI”)]
公共静态外部程序double-PropsSI(字符串输出,字符串名称1,double-Prop1,字符串名称2,double-Prop2,字符串引用);
包装库的一个主要函数的声明

在单线程环境中调用它时,一切正常。 当我尝试使用System.Threading.Tasks并行调用此外部函数时,出现了问题

[TestMethod]
公共异步任务TestAsyncMethod()
{
两倍总拥有成本=30;
字符串制冷剂=“R134a”;
var t1=Task.Run(()=>CoolProp.PropsSI(“P”,“T”,tco+273.15,“Q”,0.0,制冷剂));
var t2=任务运行(()=>CoolProp.PropsSI(“P”,“T”,tco+273.15,“Q”,0.0,制冷剂));
var res=等待任务时(t1,t2);
Assert.AreEqual(res[0],res[1]);
}
上述单元测试失败并引发以下异常:

Message: 
    Test method XRACModel_UnitTest.CoolingCircuitTest.TestAsyncMethod threw exception: 
    System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
  Stack Trace: 
    CoolPropPINVOKE.PropsSI(String jarg1, String jarg2, Double jarg3, String jarg4, Double jarg5, String jarg6)
    CoolProp.PropsSI(String Output, String Name1, Double Prop1, String Name2, Double Prop2, String FluidName) line 141
    CoolingCircuitTest.Method(Double tco, Double tev, Double sbc, String refrigerant) line 226
    <>c__DisplayClass3_0.<TestAsyncMethod>b__0() line 214
    Task`1.InnerInvoke()
    Task.Execute()
    --- End of stack trace from previous location where exception was thrown ---
    TaskAwaiter.ThrowForNonSuccess(Task task)
    TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    TaskAwaiter`1.GetResult()
    <TestAsyncMethod>d__3.MoveNext() line 217
    --- End of stack trace from previous location where exception was thrown ---
    TaskAwaiter.ThrowForNonSuccess(Task task)
    TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    ThreadOperations.ExecuteWithAbortSafety(Action action)
消息:
测试方法XRACModel_UnitTest.CoolingCircuitTest.TestAsyncMethod引发异常:
System.AccessViolationException:尝试读取或写入受保护内存。这通常表示其他内存已损坏。
堆栈跟踪:
PropsSI(字符串jarg1、字符串jarg2、双jarg3、字符串jarg4、双jarg5、字符串jarg6)
PropsSI(字符串输出,字符串名称1,双Prop1,字符串名称2,双Prop2,字符串流体名称)第141行
冷却回路试验.方法(双tco,双tev,双sbc,串制冷剂)线路226
c_uuudisplayClass3_0.b_uuu0()第214行
任务'1.InnerInvoke()
Task.Execute()
---来自引发异常的上一个位置的堆栈结束跟踪---
任务等待者。ThrowForNonSuccess(任务任务)
TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
TaskAwaiter`1.GetResult()
d__3.移动下一步()第217行
---来自引发异常的上一个位置的堆栈结束跟踪---
任务等待者。ThrowForNonSuccess(任务任务)
TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
ThreadOperations.ExecuteWithAbortSafety(操作)
问题的原因是什么?为什么使用单线程是可以的,但在多线程中却不行?
它是否是C++库(从回购中的一个问题看来)?当然,C++库本身并不是线程安全的,例如有一个静态错误字符串,它可以同时由异常处理和其他几个地方设置。如果这是在多线程上设置的,那么它可能是导致内存损坏的失败模式,它肯定是未定义的行为,应该避免。

< P>当然C++库本身不是线程安全的,例如有一个静态错误字符串,它可以同时由异常处理和其他几个地方设置。如果在多线程上设置此选项,则可能是导致内存损坏的故障模式,这肯定是未定义的行为,应该避免。

我喜欢您发现多线程问题的方式,但完全没有阅读开发人员关于该问题的消息,该消息指出“这取决于”。是的,我读过,当用户在python环境中成功地并行化了PropsSI函数时,我产生了疑问,我需要尝试一下。我怀疑这是由库引起的,但我需要更多关于原因的提示。我喜欢你如何发现多线程问题,但完全没有阅读开发人员关于该问题的信息,即“这取决于”。是的,我读到了,当用户在python环境中成功并行PropsSI函数时,我产生了怀疑,我需要试试。我怀疑这是由图书馆引起的,但我需要更多关于原因的提示。很简单,现在我觉得我的问题很愚蠢,谢谢。很简单,现在我觉得我的问题很愚蠢,谢谢