Я хочу показать в форме «динамическую метку», в которой просто пишется «Загрузка», пока работает другой поток.В этом режиме метка должна измениться:
L, Lo, Loa, Load, Loadi, Loadin, Загрузка, oading, ading, ding, ing, ng, g
Я написал код, нособытие 'BackGroundWorker_ProgressChanged, которое вызывается только тогда, когда BackGroundWorker.CancellationPending = True.
И в этот момент отправляются все обновления.
Здесь код
Public Class Form1
Dim WithEvents bgw As New BackgroundWorker
Dim WithEvents I_MyClass As MyNewClass
Dim lLoading As New Label
Dim WithEvents T As New Timer
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
bgw.WorkerReportsProgress = True
bgw.WorkerSupportsCancellation = True
I_MyClass = New MyNewClass
AddHandler I_MyClass.Start, AddressOf StartLoading
AddHandler I_MyClass.Stop, AddressOf StopLoading
With lLoading
.Size = New Size(120, 25)
.Location = New Point(10, 10)
End With
Me.Controls.Add(lLoading)
T.Interval = 1000
AddHandler T.Tick, AddressOf T_Tick
T.Start()
End Sub
Private Sub T_Tick(sender As Object, e As EventArgs) Handles T.Tick
T.Stop()
I_MyClass.StartLoading()
End Sub
Public Sub StartLoading()
If bgw.IsBusy Then Exit Sub
bgw.RunWorkerAsync()
End Sub
Public Sub StopLoading()
bgw.CancelAsync()
End Sub
Private Sub bgw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
Dim worker As System.ComponentModel.BackgroundWorker = CType(sender, System.ComponentModel.BackgroundWorker)
Dim i As Integer = 1
Dim loadingString As String = "Loading......."
Do
If (worker.CancellationPending = True) Then
e.Cancel = True
Exit Do
Else
Threading.Thread.Sleep(500)
worker.ReportProgress(i)
If i = loadingString.Count Then i = 1 Else i += 1
End If
Loop
End Sub
Private Sub bgw_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
Dim loadingString As String = "Loading......."
Dim i As Integer = e.ProgressPercentage
Dim l As Integer = lLoading.Text.Count
If l < i Then
lLoading.Text = loadingString.Substring(0, i)
Else
lLoading.Text = loadingString.Substring(i, l - i)
End If
End Sub
End Class
Public Class MyNewClass
Sub New()
End Sub
Public Event Start()
Public Event [Stop]()
Public Sub StartLoading()
RaiseEvent Start()
' simulate download
For a = 0 To 10
Threading.Thread.Sleep(1000)
Next a
RaiseEvent Stop()
End Sub
End Class
Не понимаю, почему событие BackGroundWorker_ProgressChanged не называется сообщением о частичном ходе, но вызывается несколько раз, только когда BackGroundWorker.CancellationPending = True.
PS Также приветствуется помощь на c #.