vb.net - фоновая тема - PullRequest
       1

vb.net - фоновая тема

2 голосов
/ 08 октября 2011

По какой-то причине фоновая нить в моем приложении не может изменять метки, значения текстовых полей и т. Д. В моей основной форме. Нет ошибок компиляции, когда поток выполняется, ничего не происходит.

Вот пример кода:

Imports System.Threading

Public Class Class1
    Dim tmpThread As System.Threading.Thread

    Private Sub bgFindThread()
        Form1.lblStatus.Text = "test"
    End Sub

    Public Sub ThreadAction(ByVal Action As String)
        If Action = "Start" Then
            tmpThread = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf bgFindThread))
            tmpThread.Start()
        ElseIf Action = "Abort" Then
            If tmpThread.IsAlive = True Then tmpThread.Abort()
        End If
    End Sub

End Class

Может кто-нибудь сообщить мне, что я делаю не так?

Ответы [ 4 ]

0 голосов
/ 28 сентября 2012

Вы можете использовать делегата для обновления элементов управления пользовательского интерфейса в фоновом потоке.

Пример

Private Delegate Sub bkgChangeControl(ByVal bSucceed As Boolean)
Private dlgChangeControl As bkgChangeControl = AddressOf ChangeControl

Private Sub threadWorker_ChangeControl(ByVal bSucceed As Boolean)
    Me.Invoke(dlgChangeControl, New Object() {bSucceed})
End Sub  
     Private Sub ChangeControl()
     Me.lable="Changed"
     End Sub
      'In your background thread, call threadWorker_ChangeControl.
0 голосов
/ 08 октября 2011

Вы можете получить доступ только к элементам управления пользовательского интерфейса из потока пользовательского интерфейса.

Я предлагаю сначала прочитать это: http://www.albahari.com/threading/

0 голосов
/ 08 октября 2011

Как уже упоминалось, запрещено (по уважительным причинам) обновлять элементы пользовательского интерфейса из потока, не являющегося пользовательским интерфейсом.

Каноническое решение выглядит следующим образом:

  • Проверьте, находитесь ли вы за пределами пользовательского интерфейса
  • Если это так, запрос на выполнение операции внутри потока пользовательского интерфейса
  • [Внутри потока пользовательского интерфейса] Обновите элемент управления.

В вашем случае:

Private Sub bgFindThread()
    If lblStatus.InvokeRequired Then
        lblStatus.Invoke(New Action(AddressOf bgFindThread))
        Return
    End If

    lblStatus.Text = "test"
End Sub

Единственное, что изменилось, - это выражение guard в начале метода, которое проверяет, находимся ли мы в потоке пользовательского интерфейса, и, если нет, запрашивает выполнение в потоке пользовательского интерфейса и возвращает.

0 голосов
/ 08 октября 2011

Приведенный выше код AFAIK вызовет исключение IllegalCrossThreadException, поскольку фоновый поток отличается от потока пользовательского интерфейса, а фон пытается установить значение в другом потоке.Таким образом, форма Windows проверяет все потоки, которые работают правильноВы можете установить Control.CheckForIllegalCrossThreadCalls в false, чтобы заставить его работать.

Код ниже, когда свойство настройки не запускается

Add into your code
------------------------------
Delegate Sub MyDelegate()
Private Sub RunMyControl()
  lblStatus.Text = "test"
End Sub

Change your code
------------------------------
Private Sub bgFindThread
  lblStatus.BeginInvoke (New MyDelegate(AddressOf RunMyControl))
End Sub

Метод асинхронно запускает код из фонового потока в поток пользовательского интерфейса.

...