多线程安全调用不填充组合框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