Не удается получить поток для запуска в vb.net - PullRequest
0 голосов
/ 05 февраля 2012

Я пытаюсь запустить поток в форме для функции, выполнение которой занимает около 5 секунд, чтобы я мог предотвратить блокировку пользовательского интерфейса. У меня есть следующий код ниже, но он терпит неудачу, когда он нажимает «thread1.start». Когда я смотрю его через отладчик, он просто переходит к «End Sub» и не переходит к методу getSecurityStuff (), к которому я его ожидаю. Есть идеи?

Спасибо!

Imports System.Threading

Public Class frmAddAssets

    Private theDict As Dictionary(Of String, String) = Nothing


    Private Sub frmAddAssets_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        Control.CheckForIllegalCrossThreadCalls = False

    End Sub

    Private Sub cmbTickerEntry_Leave(sender As System.Object, e As System.EventArgs) Handles cmbTickerEntry.Leave

        Dim thread1 As New Thread(New ThreadStart(AddressOf getSecurityStuff))

        thread1.Start()

    End Sub

    Public Sub getSecurityStuff()

        Dim getData As New clsSecurityView(cmbTickerEntry.Text())

        Try
            theDict = getData.getStockData()
        Catch ex As Exception
            Throw
        End Try

        filldata()

    End Sub

    Private Sub filldata()

        Dim list As New List(Of String)(theDict.Keys)

        txtTicker.Text = cmbTickerEntry.Text.ToString()

        For Each kvp As KeyValuePair(Of String, String) In theDict

            Select Case True
                Case kvp.Key = "Name"
                    txtSecurityName.Text = kvp.Value.ToString()
                Case kvp.Key = "Price"
                    txtPrice.Text = kvp.Value.ToString()
                Case kvp.Key = "Market Capitalization"
                    txtMarketCap.Text = kvp.Value.ToString()
                Case kvp.Key = "Dividend Yield"
                    txtDivYield.Text = kvp.Value.ToString()
                Case kvp.Key = "PE Ratio"
                    txtPERatio.Text = kvp.Value.ToString()
                Case kvp.Key = "EPS"
                    txtEPS.Text = kvp.Value.ToString()
            End Select

        Next

    End Sub
End Class

Ответы [ 2 ]

3 голосов
/ 05 февраля 2012

... Когда я смотрю его через отладчик, он просто переходит к "End Sub" ...

Обратите внимание, что thread1.Start() не заблокирует текущий поток,

Установка CheckForIllegalCrossThreadCalls в False ничего не будет делать, но игнорирует исключение (я), которые выбрасываются при доступе к свойствам элемента управления, принадлежащего потоку пользовательского интерфейса - что также является вашей проблемой:

  • Вы создаете новый поток
  • Новый поток вызывает getSecurityStuff
  • Вы пытаетесь объявить новый clsSecurityView с cmbTickerEntry.Text в качестве параметра.
  • EXCEPTION - вы пытаетесь получить доступ к элементу управления, принадлежащему потоку пользовательского интерфейса, находясь в другом потоке!
  • Никаких исключений не появляется, поскольку вы установили CheckForIllegalCrossThreadCalls в False

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

Решение: Используйте Invoke / BeginInvoke для выполнениякод, который должен читать / изменять свойства элементов управления, принадлежащих потоку пользовательского интерфейса.

0 голосов
/ 05 февраля 2012

Попробуйте это

Dim action as New Action(AddressOf getSecurityStuff)
action.BeginInvoke(Nothing, Nothing)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...