在多个线程中重用对象

时间:2014-02-24 21:28:14

标签: vb.net multithreading object

我有一种情况,我想在多个线程中重用一个对象。它是一个com对象,一个终端模拟器。当我继续处理报告的循环时,当我发现某些条件时,我开始一个新线程,它在另一个终端仿真器会话中提取一些信息并将其添加到集合中。我想在多个线程中重用这个终端模拟器,而不是每次都创建一个新对象。我已经尝试将它声明为静态对象,没有去,但这并不令人惊讶。我尝试在原始线程中创建它并使用synclock访问它,这似乎也不能很好地工作。我不断收到“对象引用未设置为对象的实例”错误。试着现在查一下,但我不确定我是否可以做我想做的事情。我认为invoke不是一个选项,所以我不确定这是否会像写的一样......

好的,根据请求(也可能是提出问题的好习惯)这里是我的代码,我试图使用静态...我在实际代码中有相当多的进展,所以我尝试过把它减少到只有相关的部分。

Imports System.Threading
Imports System.Threading.Tasks
Imports Reflection

Public Class optionsApplication

Private Sub parseReport

    Dim openOrderCheckTasks As Task

    Dim intCounter As Integer

    Dim terminal As Reflection.Session 'This is one example of the terminal emulator

    For intCounter = 1 to 24

        'Do some things to get data from the terminal screen

        openOrderCheckTasks = Task.Factory.StartNew(Sub() openOrderCheck(accountNum, identifier))

    Next intCounter

End Sub


Private Sub openOrderCheck

    Static openCheckTerminal As Reflection.Session
    If some openCheckTerminal is nothing then
                       openCheckTerminal = New Reflection.Session
                       formatTerminal(openCheckTerminal)  <
    End If

    SyncLock openCheckTerminal

        'Do stuff here to get data and add to a collection

    End Synclock

End Sub

End Class

我可以确认在尝试使用静态时,我得到的对象引用未设置为对象消息的实例。

我认为这开始变得更加清晰。似乎发生了什么是第二次线程试图使用这个对象时,synclock似乎停止了第一个线程的进度而第二个线程无法找到该对象。我可以看到终端在第一个线程的代码中间停止,并且当第二个线程尝试开始时发生错误。我想知道这个特定对象是否存在问题......我想我可能必须找到一种方法来查看第一个线程是否在开始第二个线程之前完成...

实际上,我错了......由于某种原因,对象在synclock之后的线程中间的第二个线程中消失了。这似乎没有任何意义。没有别的东西试图触碰那个物体。它执行一个命令,然后停止。我开始认为这个问题可能与com对象本身有关。如果有人好奇,这是Attachmate Reflections终端模拟器。

编辑:要添加完全详细丢失对象的sub的前半部分,看它是否有用。

Private Sub openOrderCheck(ByVal accountNum As String, ByVal quantity As String, ByVal optionSeries As String, ByVal openCheckTerminal As Reflection.Session)

    Dim intCounter As Integer

    Dim omsMessage As String
    Dim openOrderData(2) As String

    Debug.Print("Made it here...")
    SyncLock openCheckTerminal
        If openCheckTerminal.GetDisplayText(23, 2, 5) <> "READY" Then
            terminalFormat(openCheckTerminal)
        End If
        With openCheckTerminal
            .TransmitANSI("OMS")
            .TransmitTerminalKey(rcIBMEnterKey)
            .WaitForEvent(rcNewHostScreen, "10", "", 1, 1)
            .WaitForEvent(rcKbdEnabled, "10", "0", 1, 1)
            .TransmitANSI("5")
            .TransmitTerminalKey(rcIBMEnterKey)
            .WaitForEvent(rcNewHostScreen, "10", "", 1, 1)
            .WaitForEvent(rcKbdEnabled, "10", "0", 1, 1)
            For intCounter = 1 To 7
                .TransmitTerminalKey(rcIBMTabKey)
            Next intCounter
            .TransmitANSI(accountNum)
            .TransmitTerminalKey(rcIBMTabKey)
            .TransmitANSI(optionSeries)
            .TransmitTerminalKey(rcIBMTabKey)
            .TransmitTerminalKey(rcIBMTabKey)
            .TransmitTerminalKey(rcIBMTabKey)
            .TransmitANSI("Y")
            .TransmitTerminalKey(rcIBMEnterKey)
            .WaitForEvent(rcNewHostScreen, "10", "", 1, 1)
            .WaitForEvent(rcKbdEnabled, "10", "0", 1, 1)
            omsMessage = .GetDisplayText(24, 23, 15)
            openOrderData(0) = optionSeries
            openOrderData(1) = .GetDisplayText(13, 93, 7)
            openOrderData(2) = .GetDisplayText(13, 82, 8)
            .TransmitTerminalKey(rcIBMF3Key)
            .WaitForEvent(rcNewHostScreen, "10", "", 1, 1)
            .WaitForEvent(rcKbdEnabled, "10", "0", 1, 1)
        End With
    End SyncLock

0 个答案:

没有答案