0

編集ソリューション:

ここでは、各オブジェクトに byref 値を設定してから、backgroundworker を実行しています

Private Sub TelechargeFichier()

    Dim DocManquant As Boolean = False
    Dim docName As String = ""
    Dim lg As String = ""
    Dim telechargementFini As Boolean = False

    lblMessage.Text = EasyDealChangeLanguage.Instance.GetStringFromResourceName("1478")

    prgBar.Maximum = m_listeFichiers.Count

    For i As Integer = 0 To m_listeFichiers.Count - 1

        m_listeFichiers(i).Set_ByRefLabel(lblMessage)
        m_listeFichiers(i).Set_ByRefPrgbar(prgBar)
        m_listeThreads.Add(New Thread(AddressOf m_listeFichiers(i).DownloadMe))

    Next


    m_bgWorker = New BackgroundWorker
    m_bgWorker.WorkerReportsProgress = True
    AddHandler m_bgWorker.DoWork, AddressOf DownloadFiles
    m_bgWorker.RunWorkerAsync()







    ''Completed
    'lblMessage.Text = EasyDealChangeLanguage.Instance.GetStringFromResourceName("1383")

    'Me.DialogResult = System.Windows.Forms.DialogResult.OK

End Sub

ここに私のdownloadFiles関数があります:各開始がdownloadMe関数を実行することに注意してください以下を参照してください

  Private Sub DownloadFiles(sender As Object, e As DoWorkEventArgs)


    For i As Integer = 0 To m_listeThreads.Count - 1
        m_listeThreads(i).Start()
    Next

    For i As Integer = 0 To m_listeThreads.Count - 1
        m_listeThreads(i).Join()
    Next


End Sub

ここで問題:

それぞれがftpファイルをダウンロードする複数のスレッドがあります。完了した各ファイルが、UI スレッドからプログレス バーとラベルに値を設定することを望みます。何らかの理由で、invokerequired が false に変更されることはありません。

これがすべてのスレッドを開始する私の小さな関数です

 Private Sub TelechargeFichier()

    Dim DocManquant As Boolean = False
    Dim docName As String = ""
    Dim lg As String = ""
    Dim telechargementFini As Boolean = False

    lblMessage.Text = EasyDealChangeLanguage.Instance.GetStringFromResourceName("1478")

    prgBar.Maximum = m_listeFichiers.Count

    For i As Integer = 0 To m_listeFichiers.Count - 1

        m_listeFichiers(i).Set_ByRefLabel(lblMessage)
        m_listeFichiers(i).Set_ByRefPrgbar(prgBar)
        m_listeThreads.Add(New Thread(AddressOf m_listeFichiers(i).DownloadMe))

    Next


    For i As Integer = 0 To m_listeThreads.Count - 1
        m_listeThreads(i).Start()
    Next

    For i As Integer = 0 To m_listeThreads.Count - 1
        m_listeThreads(i).Join()
    Next

    'Completed
    lblMessage.Text = EasyDealChangeLanguage.Instance.GetStringFromResourceName("1383")

    Me.DialogResult = System.Windows.Forms.DialogResult.OK

End Sub

ここでは、UI スレッドからの Byref コントロールを保持するプロパティを示します。これは、ファイルをダウンロードする関数のアドレス (DownloadMe) を含む私のオブジェクトにあります。

    Public Sub Set_ByRefPrgbar(ByRef prgbar As ProgressBar)

    m_prgBar = prgbar

End Sub
Public Sub Set_ByRefLabel(ByRef lbl As EasyDeal.Controls.EasyDealLabel3D)

    m_lblMessage = lbl

End Sub

ダウンロード機能は次のとおりです。

   Public Sub DownloadMe()

    Dim ftpReq As FtpWebRequest
    Dim ftpResp As FtpWebResponse = Nothing
    Dim streamInput As Stream
    Dim fileStreamOutput As FileStream

    Try

        ftpReq = CType(WebRequest.Create(EasyDeal.Controls.Common.FTP_CONNECTION & m_downloadFtpPath & m_filename), FtpWebRequest)
        ftpReq.Credentials = New NetworkCredential(FTP_USER, FTP_PASS)
        ftpReq.Method = WebRequestMethods.Ftp.DownloadFile
        ftpResp = ftpReq.GetResponse
        streamInput = ftpResp.GetResponseStream()
        fileStreamOutput = New FileStream(m_outputPath, FileMode.Create, FileAccess.ReadWrite)
        ReadWriteStream(streamInput, fileStreamOutput)

    Catch ex As Exception

        'Au pire la fichier sera pas downloader

    Finally

        If ftpResp IsNot Nothing Then
            ftpResp.Close()
        End If

        Dim nomFichier As String = m_displaynameEN

        If EasyDealChangeLanguage.GetCurrentLanguageTypes = EasyDealChangeLanguage.EnumLanguageType.Francais Then
            nomFichier = m_displaynameFR

        End If
        If m_lblMessage IsNot Nothing Then
            EasyDealCommon.TH_SetControlText(m_lblMessage, String.Format(EasyDealChangeLanguage.Instance.GetStringFromResourceName("1479"), nomFichier))

        End If
        If m_prgBar IsNot Nothing Then
            EasyDealCommon.TH_SetPrgValue(m_prgBar, 1)

        End If

    End Try



End Sub

クロススレッド呼び出しソリューション関数は次のとおりです。

    Public Sub TH_SetControlText(ByVal ctl As Control, ByVal text As String)

    If ctl.InvokeRequired Then

        ctl.BeginInvoke(New Action(Of Control, String)(AddressOf TH_SetControlText), ctl, text)

    Else

        ctl.Text = text

    End If

End Sub
Public Sub TH_SetPrgValue(ByVal prg As ProgressBar, ByVal value As Integer)

    If prg.InvokeRequired Then

        prg.BeginInvoke(New Action(Of ProgressBar, Integer)(AddressOf TH_SetPrgValue), prg, value)

    Else

        prg.Value += value

    End If

End Sub

問題は、invokerequired が false にならないことです。実際には beginInvoke に入りますが、値を設定する Else セクションで終了することはありません。

4

2 に答える 2