Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个线程时,C#P/Invoke到ODBC32.dll失败_C#_Multithreading_Pinvoke - Fatal编程技术网

使用多个线程时,C#P/Invoke到ODBC32.dll失败

使用多个线程时,C#P/Invoke到ODBC32.dll失败,c#,multithreading,pinvoke,C#,Multithreading,Pinvoke,更新:下面的错误实际上是由于我错过了一个简单的错误。这里唯一真实的信息是疲倦和愚蠢是一个糟糕的组合 由于我们不得不使用ODBC驱动程序的某些特定功能,我一直在尝试编写一个直接使用ODBC调用的小应用程序。因为我最了解C#2.0,所以我一直在使用对ODBC32.dll的P/Invoke调用来实现这一点 我最初编写的代码是多线程的。但我注意到,一旦我跳转线程,就会出现AccessViolationExceptions。例如,当我在一个线程中生成对环境和连接的IntPtr引用,然后在生成语句(SQLA

更新:下面的错误实际上是由于我错过了一个简单的错误。这里唯一真实的信息是疲倦和愚蠢是一个糟糕的组合

由于我们不得不使用ODBC驱动程序的某些特定功能,我一直在尝试编写一个直接使用ODBC调用的小应用程序。因为我最了解C#2.0,所以我一直在使用对ODBC32.dll的P/Invoke调用来实现这一点

我最初编写的代码是多线程的。但我注意到,一旦我跳转线程,就会出现AccessViolationExceptions。例如,当我在一个线程中生成对环境和连接的IntPtr引用,然后在生成语句(SQLAllocStmt)的另一个线程中尝试使用这些引用时,一切都会突然发生

我相信我能解决这个问题,但有什么明显的原因吗?调用ODBC32.dll所分配的非托管内存是否以某种方式绑定到特定线程?

这取决于:

  • odbc驱动程序:它是什么
  • 你的代码:你是否在不知不觉中释放了内存
考虑:

  • 你是否真的需要这样做。您不能使用连接字符串或通过命令对象使用特定于驱动程序的命令来控制驱动程序的行为吗
  • 如果必须这样做,是否可以将其隔离到单个STA线程中,并使用编组或任务队列来简化工作
  • 如果您必须从多个线程使用它,您不能确保每个线程都有自己的连接和环境吗

odbc驱动程序是ADP提供的用于Autoline的KISAM驱动程序。我想这些信息不会有任何帮助。当然我不会犯这样愚蠢的错误来释放记忆。。。除了我刚刚检查了一下,我在我的一个对象上留下了“使用”语句,这将释放内存。哦,真丢脸。