我正在尝试在我的程序中执行任务。我启动了一个将生成日志文件的任务,之后,我想更新标签,说“Log sucessfully saved”。
这是我的代码
Private Function Createlog(ByVal mylist As List(Of classTest))
Dim sw As New StreamWriter("log_list.log")
For index = 1 To mylist.Count - 1
sw.WriteLine(mylist(index).comments)
Next
sw.Close()
Try
Me.Invoke(UpdateLabel("Log sucessfully saved"))
Catch ex As Exception
End Try
Return 1
End Function
Private Function UpdateLabel(ByVal text As String)
Label1.Text = text
Return 1
End Function
我从Load表单中的Main表单启动任务:
Dim tasktest = Task(Of Integer).Factory.StartNew(Function() Createlog(theList))
(我不知道是否更好地使用工厂或声明为任务然后task.Start())
标签更新时出现错误:
跨线程操作无效:控制从线程访问的“Label1” 除了它创建的线程。
请问您解释为什么它不能与invoke方法一起使用?你有替代解决方案吗?
感谢您的帮助
答案 0 :(得分:0)
首先,UpdateLabel
应该是Sub
,而不是Function
。其次,这一行是错误的:
Me.Invoke(UpdateLabel("Log sucessfully saved"))
再读一遍。您按顺序执行UpdateLabel
函数,然后将该函数的结果传递给Me.Invoke
(如果您使用Sub
而不是Function
,编译器应该已经警告你的错误)。
这不会引发任何编译器错误,因为没有Function
声明的As [Type]
默认为As Object
,可以转换为任何内容。它应该是:
Me.Invoke(Sub()
UpdateLabel("Log sucessfully saved")
End Sub)
为了简化,您的代码可以像这样重写:
Private Sub Createlog(ByVal mylist As List(Of classTest))
Dim sw As New StreamWriter("log_list.log")
For index = 1 To mylist.Count - 1
sw.WriteLine(mylist(index).comments)
Next
sw.Close()
Me.Invoke(Sub()
Label1.Text = "Log sucessfully saved"
End Sub)
End Sub