多线程安全调用不填充组合框vb.net
我只是想知道我做错了什么,这个原则应该行得通。谁能帮我一把吗 代码运行良好,但似乎没有将它们添加到我的组合框中 正常线程是这样开始的多线程安全调用不填充组合框vb.net,vb.net,multithreading,Vb.net,Multithreading,我只是想知道我做错了什么,这个原则应该行得通。谁能帮我一把吗 代码运行良好,但似乎没有将它们添加到我的组合框中 正常线程是这样开始的 t1 = New Thread(New ThreadStart(AddressOf GetNewClientData)) t1.Start() 数据不为空或null…:) 可能我是怎么称呼代表的 谢谢你的帮助 ****感谢@jods,这里有一个调用方法的工作代码**** 在另一个模块中启动线程 模块内的代码 问题是CreateNewSite.cbProject
t1 = New Thread(New ThreadStart(AddressOf GetNewClientData))
t1.Start()
数据不为空或null…:)
可能我是怎么称呼代表的
谢谢你的帮助
****感谢@jods,这里有一个调用方法的工作代码****
在另一个模块中启动线程
模块内的代码
问题是
CreateNewSite.cbProject
。CreateNewSite不是您的表单实例。这是一个漂亮的:p VB.NET功能,称为默认表单实例:
VB有一个“默认表单实例”的概念。对于应用程序命名空间中的每个表单,将在“我的命名空间”中的Forms属性下创建一个默认实例
您需要将正确的表单实例(即“Me”/“this”)传递给后台线程。这是winforms吗?如果是的话,你有没有考虑找一个幕后工作者?如果没有,您可能希望将每个控件的所有更改排队到一个列表中,该列表可以一次应用于该控件。这并不是真正回答您的问题,但如果您想要性能,您的代码远远不是最佳的。正在进行的线程切换太多。获取所有数据库结果并对其进行处理,以便它们可以添加到UI中。然后在一次调用中更新UI。这就是为什么你的代码不起作用对我来说并不明显。不知道我错过了什么。。。您是否在CreateNewSite.cbProject.Items.Add上设置了断点?它击中了吗?在这一点上s的价值是什么?也没有回答这个问题:远离线程,使用任务。它们更高效(因为池),更容易使用。非常奇怪。。。如果在调试器中,您在主线程上执行“CreateNewSite.cbMarket.Items.Add(s)”,而组合框中没有任何几乎不可能的更改?你什么时候开始你的线程?在初始化窗口之后,对吗?再次感谢您的努力!
Function GetNewClientData()
Try
Dim con As New SqlConnection
Dim myConString As String = My.Settings.ConString
Dim objcommand As SqlCommand = New SqlCommand
With objcommand
.Connection = con
Dim cmdText As String = "SELECT distinct Applicant,Client,Market,Project from AAClient order by Client"
.CommandText = cmdText
End With
con.ConnectionString = myConString
con.Open()
Using readerObj As SqlClient.SqlDataReader = objcommand.ExecuteReader
'This will loop through all returned records
While readerObj.Read
addClientInvoke(readerObj("Client").ToString)
addApplicantInvoke(readerObj("Client").ToString)
addMarketInvoke(readerObj("Client").ToString)
addProjectInvoke(readerObj("Client").ToString)
End While
End Using
con.Close()
Catch ex As Exception
End Try
Return Nothing
End Function
Delegate Sub addApplicant(s As String)
Sub addApplicantInvoke(ByVal s As String)
If CreateNewSite.cbApplicant.InvokeRequired Then
Dim d As New addApplicant(AddressOf addApplicantInvoke)
CreateNewSite.cbApplicant.Invoke(d, New Object() {s})
Else
CreateNewSite.cbApplicant.Items.Add(s)
End If
End Sub
Delegate Sub addClient(s As String)
Sub addClientInvoke(ByVal s As String)
If CreateNewSite.cbClient.InvokeRequired Then
Dim d As New addClient(AddressOf addClientInvoke)
CreateNewSite.cbClient.Invoke(d, New Object() {s})
Else
CreateNewSite.cbClient.Items.Add(s)
End If
End Sub
Delegate Sub addMarket(s As String)
Sub addMarketInvoke(ByVal s As String)
If CreateNewSite.cbMarket.InvokeRequired Then
Dim d As New addMarket(AddressOf addMarketInvoke)
CreateNewSite.cbMarket.Invoke(d, New Object() {s})
Else
CreateNewSite.cbMarket.Items.Add(s)
End If
End Sub
Delegate Sub addProject(s As String)
Sub addProjectInvoke(ByVal s As String)
If CreateNewSite.cbProject.InvokeRequired Then
Dim d As New addProject(AddressOf addProjectInvoke)
CreateNewSite.cbProject.Invoke(d, New Object() {s})
Else
CreateNewSite.cbProject.Items.Add(s)
End If
End Sub
t1 = New Thread(New ParameterizedThreadStart(AddressOf GetNewClientData))
t1.Start(Me)
Function GetNewClientData(ByVal oldForm As CreateNewSite)
Try
Dim con As New SqlConnection
Dim myConString As String = My.Settings.ConString
Dim objcommand As SqlCommand = New SqlCommand
With objcommand
.Connection = con
Dim cmdText As String = "SELECT distinct Applicant,Client,Market,Project from AAClient order by Client"
.CommandText = cmdText
End With
con.ConnectionString = myConString
con.Open()
Using readerObj As SqlClient.SqlDataReader = objcommand.ExecuteReader
'This will loop through all returned records
While readerObj.Read
addApplicantInvoke(readerObj("Applicant").ToString, oldForm)
addClientInvoke(readerObj("Client").ToString)
addMarketInvoke(readerObj("Market").ToString)
addProjectInvoke(readerObj("Project").ToString)
End While
End Using
con.Close()
Catch ex As Exception
MsgBox(ex)
End Try
Return Nothing
End Function
Delegate Sub addApplicant(s As String, oldform As CreateNewSite)
Sub addApplicantInvoke(ByVal s As String, ByVal oldform As CreateNewSite)
If oldform.InvokeRequired Then
Dim d As New addApplicant(AddressOf addApplicantInvoke)
oldform.cbApplicant.Invoke(d, New Object() {s, oldform})
Else
oldform.cbApplicant.Items.Add(s)
End If
End Sub