2012-02-05 5 views
0

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

Спасибо!

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 
+3

Совет: не инициализируйте ничего «ничего», это бессмысленно. – Ryan

+2

Ваш отладчик отправляется в «End Sub», потому что это следующая строка. Поместите точку останова в начале «getSecurityStuff» для отладки нового потока. – ken

+1

Фактически, [здесь ваш код просто вообще очищен] (http://codepad.org/z9QJjL3P). – Ryan

ответ

3

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

Пожалуйста, обратите внимание, что thread1.Start() не будет блокировать текущий поток.

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

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

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

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

+0

Хороший совет, но я думаю, что исключение возникает только при отладке, чтобы убедиться, что эта ошибка не была выполнена.Установка 'CheckForIllegalCrossThreadCalls' на' False' должна исключать исключения и продолжать с кодом ... Я думаю, что проблема может быть в другом месте. – Ryan

+0

minitech, установка 'CheckForIllegalCrossThreadCalls' на' False' не будет * предотвращать * исключения, он будет * игнорировать * их и, следовательно, отключиться. – ebb

+0

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.checkforillegalcrossthreadcalls.aspx «пока приложение отлаживается». – Ryan

-1

Попробуйте

Dim action as New Action(AddressOf getSecurityStuff) 
action.BeginInvoke(Nothing, Nothing) 
+0

А что поможет? Это то же самое, за исключением использования потока из пула потоков. – Ryan

+0

@minitech OP опубликовал, что _fails, когда он попадает в "thread1.start." _ Поэтому мое предложение пытается использовать другой синтаксис. – Oybek

Смежные вопросы