1

ファイル名を含むリストボックスをループして、バックグラウンド ワーカーで FTP サーバーにアップロードしようとしています。バックグラウンドワーカー内でListbox1.Items.Countにアクセスしようとすると(明らかに別のスレッド上にあるため)、forループでクロススレッド例外が発生するため、リストボックスをバックグラウンドワーカーに渡す方法に興味があります以下に記述した方法でコードを実行しますか?

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
4

3 に答える 3

0

アイテムを文字列配列として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
于 2012-12-07T09:12:41.633 に答える
0

RunWorkerAsync を呼び出すと、オブジェクトをパラメーターとして渡すことができます。このオブジェクトを使用して、DDL を渡すことができます。

次に、DoWork イベントで、次のように DDL を利用できます。

Dim ddl = CType(e.Arugment, DropDownList)

BackgroundWorker.RunWorkerAsync メソッド

于 2012-12-07T09:12:12.383 に答える
0

次の 2 つの選択肢があります。

別のスレッドで実行します。

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;
        }));
于 2012-12-07T11:30:58.217 に答える