在VB.NET2010中如何将列表框传递到后台工作程序
我试图通过一个包含文件名的列表框进行循环,并使用后台工作程序将其上载到FTP服务器。当我试图在后台工作程序中访问Listbox1.Items.Count时,我在for循环中遇到了一个跨线程异常(显然是因为它位于另一个线程上),因此我很好奇如何将listbox传递到后台工作程序中,以执行我在下面编写的代码在VB.NET2010中如何将列表框传递到后台工作程序,vb.net,Vb.net,我试图通过一个包含文件名的列表框进行循环,并使用后台工作程序将其上载到FTP服务器。当我试图在后台工作程序中访问Listbox1.Items.Count时,我在for循环中遇到了一个跨线程异常(显然是因为它位于另一个线程上),因此我很好奇如何将listbox传递到后台工作程序中,以执行我在下面编写的代码 Private Sub bgw_upAllFiles_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel
Private Sub bgw_upAllFiles_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw_upAllFiles.DoWork
Dim i
Dim toPath As String = MyForms.MoveOutFTPFormDir & PDFVar_PHOTO_URL_NUM & "/"
For i = 0 To e.Argument.Items.Count - 1
Try
retryDL:
My.Computer.Network.UploadFile(ListBox1.Items(i).ToString, toPath & IO.Path.GetFileName(ListBox1.Items(i).ToString), MyForms.MoveOutFTPUser, MyForms.MoveOutFTPPwd)
Catch ex As Exception
If ex.ToString.Contains("error: (550)") Then
'MsgBox("Need to create FTP folder")
Try
Dim myftprequest As Net.FtpWebRequest = CType(Net.FtpWebRequest.Create(toPath), System.Net.FtpWebRequest)
myftprequest.Credentials = New System.Net.NetworkCredential("JeffreyGinsburg", "andy86")
myftprequest.Method = System.Net.WebRequestMethods.Ftp.MakeDirectory
myftprequest.GetResponse()
GoTo retryDL
Catch ex2 As Exception
ex2.ToString()
End Try
Else
MsgBox(ex.ToString)
End If
MDIParent1.StatusStrip.Items.Item(2).Text = "Upload Complete"
End Try
Next
End Sub
调用RunWorkerAsync时,可以将对象作为参数传递。您可以使用此对象并传入DDL 然后,在DoWork事件中,您可以像这样使用DDL:
Dim ddl = CType(e.Arugment, DropDownList)
将项目作为字符串数组传递给backgroundworker:
BackgroundWorker1.RunWorkerAsync(ListBox1.Items.Cast(Of String).ToArray)
然后在dowork子目录中迭代该数组:
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim files As String() = DirectCast(e.Argument, String())
For Each file As String In files
'My.Computer.Network.UploadFile(file, ......
Next
End Sub
你有两个选择:
在其他线程上运行:
worker.RunWorkerAsync(Listbox1.Items.Cast().ToList())
然后使用:
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
var items = e.Argument as List<string>;
}
ListBox1.Invoke(new Action(() =>
{
var items = ListBox1.Items;
}));