对象不能保留Timer Tick事件的值

时间:2015-12-02 03:15:05

标签: .net vb.net

我有一个计时器事件,调用类似于下面的代码。我的问题是,间歇性地,myObject变量不会保留前一次执行中bSuppresssSuppress的值,最终我会丢失文本。我有时可以运行我的代码25次没有问题。然后,它开始变得非常蓝色,每4次中有1次。非常感谢任何帮助。

谢谢

Private myObject as New someClass
Private sOutput as string
Private cQueue As New Collection

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
       Dim sCmd as string

       sCmd=cQueue (1)
       sOutput &= myObject.getText(sCmd)
       cQueue.Remove(1)

end sub

Public Sub DoText(ByVal sText As String)
   'received from a socket connection on a separate thread
   cQueue.Add(sText)

End Sub

Public Class someClass

        Private sSuppress as String
        Private bSuppress as Boolean

        Public function getText(sText as String) as String

                'if we didn't end in a space during the last function call
                'than prepend the previous input string

                if bSuppress then
                    sText=sSuppress & sText
                end if

                If right(sText, 1)<>" " then
                     bSuppress=true
                     sSuppress=sText
                     exit function
                end if

             return sText

        end function
End Class

2 个答案:

答案 0 :(得分:0)

查看此代码

If right(sText, 1)<>" " then
    bSuppress=true
    sSuppress=sText
    exit function
end if

可以告诉您,您不能保证bSuppresssSuppress的价值保留。条件right(sText, 1)<>" "评估为true时,您的值会发生变化。

此外,查看您的代码我可以提及以下

  1. Timer_Tick在不同的线程上运行,并且无法保证按顺序执行,特别是如果滴答很接近
  2. cQueue.Add(sText)cQueue(1) ...为什么不cQueue(0)?你如何确定索引?
  3. 如果您需要排队,为什么不使用Queue对象,而是使用Collection?请记住,今天您永远不应该使用Collection和/或ArrayList - 这些仅用于向后兼容。
  4. 您可能应该告诉我们您要实现的目标,我们可以帮助您正确地重构代码。

答案 1 :(得分:0)

我认为,由于Timer1_Tick()和DoText()在不同的线程上运行,您需要使用某种线程安全互斥技术,例如SyncLock。您不希望DoText()中断Timer1_Tick()中的语句。

composite -dissolve 10% -gravity center -quality 100 watermark_350.png my_own_png.png result.png