Can';无法在vb.net中启动线程

Can';无法在vb.net中启动线程,vb.net,winforms,multithreading,Vb.net,Winforms,Multithreading,我正在尝试在一个函数的窗体中启动一个线程,该函数运行大约需要5秒钟,这样我就可以防止UI被锁定。我有下面的代码,但当它点击“thread1.start”时失败。当我通过调试器查看它时,它只会转到“End Sub”,而不会转到我希望它转到的getSecurityStuff()方法。有什么想法吗 谢谢 Imports System.Threading Public Class frmAddAssets Private theDict As Dictionary(Of String, St

我正在尝试在一个函数的窗体中启动一个线程,该函数运行大约需要5秒钟,这样我就可以防止UI被锁定。我有下面的代码,但当它点击“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
试试这个

Dim action as New Action(AddressOf getSecurityStuff)
action.BeginInvoke(Nothing, Nothing)
…当我通过调试器观看它时,它只是走到了“结束” 子“

请注意
thread1.Start()
不会阻止当前线程

CheckForIllegalCrossThreadCalls
设置为
False
不会做任何事情,但会忽略在访问UI线程所拥有的控件的属性时引发的异常-这也是您的问题:

  • 创建一个新线程
  • 新线程调用
    getSecurityStuff
  • 您尝试声明一个新的
    clsSecurityView
    ,参数为
    cmbTickerEntry.Text
  • 异常-您在另一个线程上尝试访问UI线程拥有的控件
  • 没有出现异常,因为您已将
    CheckForIllegalCrossThreadCalls
    设置为
    False
同样处理
fillData
。。。尝试访问UI线程之外的控件


解决方案:使用
Invoke
/
BeginInvoke
执行应读取/修改UI线程所拥有控件属性的代码。

代码提示:不要将任何内容初始化为
Nothing
,这是毫无意义的。调试器转到“End Sub”,因为这是下一行。在“getSecurityStuff”的开头放置一个断点以调试新线程。事实上,。感谢您的重新编写。“我喜欢它与我的相比有多紧凑。@LanceCollins:一个
新线程
接受的委托是
ParameterizedThreadStart
,它可以接受一个
对象
参数。这将部分消除对
CheckForIllegalCrossThreadCalls=False
的需要-只需确保您强制转换它。这将如何帮助您?这是一样的,除了使用线程池中的线程。@minitech OP在点击“thread1.start”时失败。因此我的建议是尝试不同的语法可能会有所帮助。很好的建议,但我认为只有在调试时才会出现异常,以确保不会犯这种错误。将
CheckForIllegalCrossThreadCalls
设置为
False
应该可以防止异常并继续执行代码。。。我认为问题可能出在其他地方。minitech将
CheckForIllegalCrossThreadCalls
设置为
False
不会阻止异常,它会忽略异常,因此会保持沉默。minitech说他没有在调试模式下测试?我不知道你为什么会认为
CheckForIllegalCrossThreadCalls
的值只在调试模式下起作用,而
Lance Collins
没有说明他是如何运行应用程序的。试试看:打开一个新的Windows窗体应用程序并粘贴进去。然后取消对该行的注释。它可以工作-InvalidOperationException是一种防止同步错误的尝试。我想说的是,这可能不是问题的根源。