2017-01-11 12 views
0

foreach-loop中にラベルを更新したい。foreachループのラベルテキストを変更する

問題は次のとおりです。ループが完了するまでプログラムは待機し、ラベルを更新します。

foreach-loop中にラベルを更新することはできますか?

コード:事前に

Dim count as Integer = 0 
For Each sFile as String in Files 
    'ftp-code here, works well 
    count = count+1 
    progressbar1.value = count 
    label1.text = "File " & count & " of 10 uploaded." 
next 

おかげ

+0

このコードを試してみましたか?結果は何でしたか? – ADyson

+0

答えははいです。あなたが自分の質問に答えたように、まずそれを試してみたはずです。 –

+0

それはそうですが、私はあなたがUIの凍結よりもむしろそれが更新として反映されるのを見たいと思っていますか?それは問題ですか? – Bugs

答えて

2

ラベルがあなたのforeachループを実行しながら、UIスレッドがブロックされているため、更新されません。
あなたがasync-awaitを使用するための完璧な候補であるFTP接続、で動作しますので、あなたがasync-awaitアプローチ

Private Async Sub Button_Click(sender As Object, e As EventArgs) 
    Dim count as Integer = 0 
    For Each sFile as String in Files 
     'ftp-code here, works well 
     count = count+1 

     progressbar1.value = count 
     label1.text = "File " & count & " of 10 uploaded." 

     Await Task.Delay(100) 
    Next 
End Sub 

を使用することができます。

Await行は、ラベルを新しい値で更新するUIスレッドをリリースし、100ミリ秒後にその行から続行します。

あなたはFTP接続のための非同期コードを使用する場合は、あなたはすでに答えを受け入れてきましたが、ちょうど代替としてBackgroundWorkerのも、このような何かのために使用することができるTask.Delay

+0

私のプログラムは 'タスク'を認識しません。私が知るべきことがそれ以上ありますか?たぶん私はちょうどあなたが意味することを誤解しました。 – neverlucky

+1

あなたは 'System.Threading.Tasks'への参照が必要です – Fabio

0

必要はありません。私の場合、元のファイルを取得するFTPは非常に迅速に行われるので、DoWorkイベントのこのスニペットは、それらのファイルをプリンタにダウンロードするためのものです。 ReportProgressイベントで

Dim cnt As Integer = docs.Count 
Dim i As Integer = 1 
For Each d As String In docs 
    bgwTest.ReportProgress(BGW_State.S2_UpdStat, "Downloading file " & i.ToString & " of " & cnt.ToString) 

    Dim fs As New IO.FileStream(My.Application.Info.DirectoryPath & "\labels\" & d, IO.FileMode.Open) 
    Dim br As New IO.BinaryReader(fs) 
    Dim bytes() As Byte = br.ReadBytes(CInt(br.BaseStream.Length)) 

    br.Close() 
    fs.Close() 
    For x = 0 To numPorts - 1 
     If Port(x).IsOpen = True Then 
      Port(x).Write(bytes, 0, bytes.Length) 
     End If 
    Next 
    If bytes.Length > 2400 Then 
     'these sleeps are because it is only 1-way comm to printer so I have no idea when printer is ready for next file 
     System.Threading.Thread.Sleep(20000) 
    Else 
     System.Threading.Thread.Sleep(5000) 
    End If 

    i = i + 1 
Next 

...(もちろん、あなたがTrueにWorkerReportsProgressプロパティを設定する必要があります)

Private Sub bgwTest_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwTest.ProgressChanged 

    Select Case e.ProgressPercentage 
     'BGW_State is just a simple enum for the state, 
     'which determines which UI controls I need to use. 
     'Clearly I copy/pasted from a program that had 15 "states" :) 
     Case BGW_State.S2_UpdStat 
      Dim s As String = CType(e.UserState, String) 
      lblStatus.Text = s 
      lblStatus.Refresh() 

     Case BGW_State.S15_ShowMessage 
      Dim s As String = CType(e.UserState, String) 
      MessageBox.Show(s) 

    End Select 

End Sub 
-1

が、Application.DoEventsを(使用には十分ではありませんか)?これによりビルドがクリアされ、テキストフィールドが非常に迅速に更新されるのを確認できるはずです。

+0

[DoEvents Evilですか?](https://blog.codinghorror.com/is-doevents-evil/)、[Use Application.DoEvents()](http ://stackoverflow.com/a/5183623/1115360)。 –

関連する問題