从任务更新标签

时间:2015-04-01 07:53:35

标签: vb.net multithreading task

我正在尝试在我的程序中执行任务。我启动了一个将生成日志文件的任务,之后,我想更新标签,说“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方法一起使用?你有替代解决方案吗?

感谢您的帮助

1 个答案:

答案 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