2014-09-05 89 views
0

基本上,我拥有的是一个后台工作者。一个按钮被点击和按钮有BackgroundWorker.DoWork的DoWork的温控功能具有此代码:For Loop Inside BackgroundWorker.DoWork

For Each item In lst_Folders.CheckedItems 
     Dim path As String = My.Settings.stng_sourceDirectory + "\" + item.Text 
     For Each dirPath As String In Directory.GetDirectories(path, "*", SearchOption.AllDirectories) 
      Directory.CreateDirectory(dirPath.Replace(path, My.Settings.stng_saveDirectory + "\" + item.Text)) 
     Next 

     'Copy all the files & Replaces any files with the same name 
     For Each newPath As String In Directory.GetFiles(path, "*.*", SearchOption.AllDirectories) 
      File.Copy(newPath, newPath.Replace(path, My.Settings.stng_saveDirectory + "\" + item.Text), True) 
     Next 
Next 

它基本上是复制和粘贴的目录,这取决于ListViewItem的检查。问题是,当我按一下按钮,背景的工作,但我立刻得到一个错误说

Cross-thread operation not valid: Control 'lst_Folders' accessed from a thread other than the thread it was created on.

可有人请这个问题帮助我。我只是不知道为什么它不会工作。

回答

2

您应该只能访问UI线程上的UI控件属性。当你运行后台工作者时,你可以传递一个参数给它。我建议您从UI中复制所需的值,并将它们作为参数传递给后台工作人员,而不是让后台工作人员直接读取UI。

例如事件处理程序中做这样的事情:

Private Sub startAsyncButton_Click(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles startAsyncButton.Click 

    Dim folderNames As New List(Of String) 
    For Each item In lst_Folders.CheckedItems 
     folderNames.Add(item.Text) 
    Next 
    backgroundWork.RunWorkerAsync(folderNames) 

而且在你的工作方法:

' This event handler is where the time-consuming work is done. 
Private Sub backgroundWorker1_DoWork(ByVal sender As System.Object, _ 
ByVal e As DoWorkEventArgs) Handles backgroundWorker1.DoWork 
    Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) 
    Dim folderNames As List(of String) = CType(e.Argument, List(Of String)) 

    For Each folderName In folderNames 
     Dim path As String = My.Settings.stng_sourceDirectory + "\" + folderName 
    ' ... 

欲了解更多信息,请参阅:BackgroundWorker.RunWorkerAsync Method (Object)