我有一个多线程的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文件中。答案 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