关闭

时间:2015-09-18 12:06:21

标签: .net vb.net multithreading thread-safety

我有一个多线程的VB.net程序。我想遍历每个线程并从每个线程获取会话。

这里是创建线程的代码。

Sub Run():
    Timer1.Enabled = True
    AddHandler LoginTimer.Elapsed, AddressOf doWork
    LoginTimer.Interval = 500
    LoginTimer.Enabled = True
End Sub

这里是doWork()子:

sub doWork()
    For id = 0 to val(textbox1.text) ' get how many thread should we run
                Dim th As New Thread(AddressOf Work) ' what the threads should do.
                th.IsBackground = True
                th.Start()
    Next id

现在每次关闭程序时,线程都会中止,我丢失了那些线程一直在处理的所有东西。所以,我想保存会话。下次我跑的时候,我只是“恢复”'它通过加载会话。类似的东西:

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    Dim sessions As New List(Of String)
    For Each thread In xxxx ' here where should I do a loop through the running threads
       sessions.Add(thread.session) ' get the session from the thread
    Next thread 
End Sub

提前致谢

编辑:我设法通过创建"公共共享ShoulIupadteNow作为布尔"来解决我的问题,因为我的线程在连续循环中运行,所以他们一直检查布尔集是否为真。当它(我通常点击一个在我的表单上设置为true的按钮)时,它通过将公共共享的lstsessions作为新的hashset(字符串)开始更新,这样我就不会有重复的会话而且一次全部线程完成更新我遍历hashset中的所有内容,然后将其存储在txt文件中。

1 个答案:

答案 0 :(得分:0)

如果您的问题是从每个线程保存内容,您可以将所需的数据保存在调用每个线程的顶级类中的公共变量中。例如,我在类GUI中有一个名为controlador的类。此类处理其他线程。当有想要传递给类GUI的其他线程的信息时,我将信息保存在controlador属性中,然后通过类GUI调用属性。我不知道我是否清楚自己。唯一的问题是如果要从其他线程之一更新类GUI中的控件。如果是这种情况,你应该在GUI类中使用这样的方法:

Delegate Sub SetDebugLabel_Delegate(ByVal lbl As Label, ByVal text As String)

Public Sub SetDebugLabel_ThreadSafe(ByVal lbl As Label, ByVal text As String)
    If lbl.InvokeRequired Then
            Dim MyDelegate As New SetDebugLabel_Delegate(AddressOf SetDebugLabel_ThreadSafe)
            Me.Invoke(MyDelegate, New Object() {lbl, text})
    Else
        lbl.Text = text
    End If
End Sub

然后你应该在do work sub里面使用这样的东西:

 SetDebugLabel_ThreadSafe(Me.lblDataServer, ctrl.dTempo)

其中ctrl是实例化的controlador类。

如果您喜欢XML方法,可以将所需数据保存到数据表中,然后导出到XML。

https://msdn.microsoft.com/en-us/library/system.data.datatable.writexml(v=vs.110).aspx中可以看到一种方法,或者你可以这样做:

    Dim settings As XmlWriterSettings = New XmlWriterSettings()
    settings.Indent = True


Using writer As XmlWriter = XmlWriter.Create(caminho & "alarmes.xml", settings)

   ' Begin writing.
     writer.WriteStartDocument()
     writer.WriteStartElement("CNCO") ' Root.

     With Login.user.DB1.dsDados.Tables("Lista")
         For i As Integer = 0 To .Rows.Count - 1
              writer.WriteStartElement("Duto")
              writer.WriteElementString("Nome", "Alarmes")
              writer.WriteElementString("TAG", .Rows(i)("TAG"))
              writer.WriteEndElement()
         Next

         ' End document.
         writer.WriteEndElement()
         writer.WriteEndDocument()

    End With
 End Using

要读取XML,只需读取路径(arquivo是路径字符串)并将数据恢复到数据表中。一种方法可以这样做:

 With Login.user.DB1.dsDados
          .Tables("Lista").Clear()
          .ReadXml(arquivo)
          .Tables(0).DefaultView.Sort = "TAG DESC"
 End With