【发布时间】:2025-12-02 23:30:01
【问题描述】:
我正在尝试在一个表单中为一个需要大约 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
【问题讨论】:
-
代码提示:不要将任何东西初始化为
Nothing,这是没有意义的。 -
您的调试器转到“End Sub”,因为那是下一行。在“getSecurityStuff”的开头放一个断点来调试新线程。
-
感谢您的重写。我喜欢它与我相比的紧凑程度。
-
@LanceCollins:
New Thread接受的委托是ParameterizedThreadStart,它可以采用单个Object参数。这将部分消除对CheckForIllegalCrossThreadCalls = False的需求 - 只需确保您投射它即可。
标签: vb.net winforms multithreading