Can';无法在vb.net中启动线程
我正在尝试在一个函数的窗体中启动一个线程,该函数运行大约需要5秒钟,这样我就可以防止UI被锁定。我有下面的代码,但当它点击“thread1.start”时失败。当我通过调试器查看它时,它只会转到“End Sub”,而不会转到我希望它转到的getSecurityStuff()方法。有什么想法吗 谢谢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
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是一种防止同步错误的尝试。我想说的是,这可能不是问题的根源。