VB.NET中的委托是否总是在不同的线程中运行?

时间:2017-06-17 22:47:30

标签: c# c++ vb.net multithreading

我有一个VB.NET应用程序似乎在VS2012 IDE中完美运行。它处理数千条记录。当我将其编译为发布时,它将处理随机数量的记录(< 200)并且使用"对象引用未设置为对象的实例。"

它总是在我调用的外部C ++ DLL中死掉,它也会回调我的代码。来自非托管代码的回调需要使用委托。我不熟悉代表们以前从未使用它们的复杂性。

在我的研究中,我注意到它们用于启动多线程。是否有可能无意中使我的应用程序多线程化?

这是我正在使用的语法;

Public Delegate Sub EditsMessagerHandlerDelegate(ByRef objThis As IntPtr, _
                                              ByVal strEditTag As String, _
                                              ByVal strEditName As String, _
                                              ByVal strAdminCode As String, _
                                              ByVal strErrorType As String, _
                                              ByVal strMessage As String)
    Dim objEditsMessagerHandler As New EditsMessagerHandlerDelegate(AddressOf EditsMessagerHandler)
    Dim ptrEditsMessagerHandler As IntPtr = Marshal.GetFunctionPointerForDelegate(objEditsMessagerHandler)
    Edit_RunEdits(_intsmfID, _strEditSetTag, _strEditLayoutTag, strNAACCRRecord, _
                                    EE_NOSKIP, intErrCount, ptrThis, ptrEditsMessagerHandler)

我的问题;

这会导致应用程序出现多线程吗?

无意中多线程的应用会导致我遇到的错误吗?

如何强制它在同一个线程中运行?

我无法控制C ++ DLL,也无法查看源代码。

修改

这不是关于"对象引用未设置为对象实例的问题。"这是一个关于使用p / invoke是否会无意中导致多线程的问题。

我已阅读链接文章以及许多其他文章,并且所提出的问题似乎都不适用。请不要因为你认为提出错误的问题而不得不重复。如果您对我的具体问题有答案,请回复。

我被要求发布问题的堆栈跟踪,就在这里;

System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
   at ACE.OraEditsLib50.processRecord(String strInterRecordEditsName, OracleConnection objConnection) in I:\FCDSApps\OraEditsLib50\OraEditsLib50\OraEditsLib50.vb:line 299

有趣的是,299行不是它执行的最后一行VB行。我已经验证了在该行的另一个类中的函数调用以及另外10-15行代码一直执行,直到它调用C ++ DLL。 再次编辑

虽然"重复"上面的消息没有解决我的问题,我的程序所遇到的问题与多线程无关。

我在类中的方法中的局部变量中定义了我的委托的对象和指针。我没有妥善处理这些物品。退出类中的方法之前的指针。为了解决这个问题,我将这些对象移到了#34; private"变量,因为它们在实例化的类的生命周期中永远不会改变,我的问题就消失了。

其他成员之一(我会提到他的名字,但他可能不希望别人认为他会提供他提供给我的帮助)这里实际上查看了我的一些代码并提出修复问题的建议。 / p>

0 个答案:

没有答案