Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net backgroundworker抛出;创建表单时出错…“;_Vb.net_Multithreading_Backgroundworker - Fatal编程技术网

Vb.net backgroundworker抛出;创建表单时出错…“;

Vb.net backgroundworker抛出;创建表单时出错…“;,vb.net,multithreading,backgroundworker,Vb.net,Multithreading,Backgroundworker,我有一个主窗体,它有一个按钮,可以在datagrid上打开主客户。我使用dataview是为了使用dataview.rowfilter过滤数据。 问题是,在表单加载期间。这需要5-6秒(在此期间程序没有响应)。我试图做的是在后台将数据加载到dataview,并在workercompleted上的gridview上显示它 它给了我以下错误:“创建表单时出错。有关详细信息,请参阅Exception.InnerException。错误是:在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模

我有一个主窗体,它有一个按钮,可以在datagrid上打开主客户。我使用dataview是为了使用dataview.rowfilter过滤数据。 问题是,在表单加载期间。这需要5-6秒(在此期间程序没有响应)。我试图做的是在后台将数据加载到dataview,并在workercompleted上的gridview上显示它

它给了我以下错误:“创建表单时出错。有关详细信息,请参阅Exception.InnerException。错误是:在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。请确保主函数上标记了STAThreadAttribute。”-->on dowork

我在某个地方读到我应该使用Invoke。但我不知道如何使用它。 这是我的密码:

Private Sub custcall_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    TBfind.Enabled = False
    SetMyCustomFormat("yyyy-MM-dd HH:mm:ss")
    BWcustload.RunWorkerAsync()

End Sub

Private Sub BWcustload_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BWcustload.DoWork

    mydataview = New DataView(datatablecust)
End Sub

 Private Sub BWcustload_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BWcustload.RunWorkerCompleted
    DGVcustomer.DataSource = mydataview
    TBfind.Enabled = True
End Sub

您是否尝试过将代码移动到所示的事件表单中

另外,您是否尝试过将代码放入同步锁中的DoWork部分

试试这个:

SyncLock mydataview

    mydataview = New DataView(datatablecust)

End SyncLock
至于STA模型。。。尝试将其添加到代码中,并将启动对象设置为Sub Main()

声明一个函数以处理数据的实际加载:

Private Sub LoadData()
    mydataview = New DataView(datatablecust)
End Sub
然后,您将在显示的事件(或加载事件)中启动一个新线程:

这就避免了必须使用SyncLock(尽管在某些情况下,如果它最终不能正常工作,您可能会希望这样做)


别忘了在代码文件顶部添加导入系统线程。

你好,nathan,谢谢你的回复。使用synclock方法,snyclock部分会出现“声明预期”错误。当我使用invoke方法时,它可以工作,但仍然需要5-6秒的加载时间。您是否记得向SyncLock添加一个符合条件的对象?请注意,我在上面键入了“SyncLock mydataview”,可以添加另一个线程来监视加载进度,方法是检查控件上导入的记录数并将其报告给表单,以便用户知道数据仍在加载。不幸的是,如果您有大量需要导入的数据,那么在加载时间方面就无能为力。
 Delegate Sub LoadDataCallback()
Private Sub LoadData()
    mydataview = New DataView(datatablecust)
End Sub
Dim mythread As New Thread(Sub()
                               Dim callLoad As New LoadDataCallBack(LoadData)

                               Me.Invoke(callLoad)
                           End Sub)

mythread.Start()