2015-04-01 64 views
0

我试图在我的程序中实现任务。我启动将生成日志文件的任务,之后,我想更新标签以说“日志成功保存”。更新任务中的标签

这里是我的代码

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 

我启动从主窗体的任务负载():

Dim tasktest = Task(Of Integer).Factory.StartNew(Function() Createlog(theList)) 

(我不知道这是否是最好使用厂家或声明的任务,然后task.Start())

我对标签更新错误:

跨线程操作无效:从线程 以外的线程访问控制'Label1',而不是创建它的线程。

你能解释一下为什么它不能与invoke方法一起工作吗?你有其他解决方案吗?

感谢您的帮助

+0

在你UpdateLabel方法,尝试设置它的文本之后刷新您的Label1。这将强制标签重新绘制。例如,label1.Refresh() – 2015-04-01 11:48:28

+0

我不能因为当我更改label1.text时处理错误 – Romain 2015-04-01 12:13:43

回答

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 
+0

感谢您对此有用的解释和解决方案。 – Romain 2015-04-08 07:20:16