Странное поведение при использовании thread.sleep
Привет,
Я сделал небольшой пример проекта, чтобы научиться использовать делегат для обновления пользовательского интерфейса (более старый способ / pre-Net4.0). Я понятия не имею, что может быть не так, так как пользовательский интерфейс иногда обновляется, а иногда нет - но никогда не в ожидаемом способе подсчета вверх (видимый), а только результат (в основном) отображается.
Как только я раскомментирую "нить.Строка "Sleep" в ThreadClass пользовательский интерфейс зависает сразу же после нажатия кнопки.
Поскольку я получаю такое непредсказуемое поведение, я уже боюсь, что у меня может быть совершенно не связанная проблема... возможно, с настройкой VS. Не будете ли вы так любезны взглянуть на код и заверить меня, что он верен или нет? Я не понимаю, почему "нить.Sleep(50)" приведет к замороженному пользовательскому интерфейсу.
Большое спасибо,
Майкл
EDIT: пользовательский интерфейс заморожен, но когда я устанавливаю точку останова, я вижу, что счетчик увеличивается. В конце цикла пользовательский интерфейс снова свободен. Значит, я что-то исказил...
Что я уже пробовал:
Код таков:
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Dim foo As New ThreadClass foo.LongLastingProcess(10000, AddressOf SetUIText) 'long running End Sub Friend Sub SetUIText(ByVal statusText As String, ByVal labelText As String) If Me.InvokeRequired Then Dim d As New UITestDelegate(AddressOf SetUIText) Me.Invoke(d, New Object() {statusText, labelText}) Else Me.ToolStripStatusLabel1.Text = statusText Me.Label1.Text = labelText End If End Subв виде кода и еще одного класса
Friend Delegate Sub UITestDelegate(ByVal d As String, ByVal labelText As String) Friend Class ThreadClass Public Sub New() End Sub Friend Sub LongLastingProcess(ByVal number As Integer, ByVal UpdateMethod As UITestDelegate) For i As Integer = 0 To number Dim msg As String = String.Format("Loop {0}", i) 'Threading.Thread.Sleep(50) UpdateMethod.Invoke(msg, msg) Next End Sub End Class