Vb.net backgroundworker抛出;创建表单时出错…“;
我有一个主窗体,它有一个按钮,可以在datagrid上打开主客户。我使用dataview是为了使用dataview.rowfilter过滤数据。 问题是,在表单加载期间。这需要5-6秒(在此期间程序没有响应)。我试图做的是在后台将数据加载到dataview,并在workercompleted上的gridview上显示它 它给了我以下错误:“创建表单时出错。有关详细信息,请参阅Exception.InnerException。错误是:在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。请确保主函数上标记了STAThreadAttribute。”-->on dowork 我在某个地方读到我应该使用Invoke。但我不知道如何使用它。 这是我的密码:Vb.net backgroundworker抛出;创建表单时出错…“;,vb.net,multithreading,backgroundworker,Vb.net,Multithreading,Backgroundworker,我有一个主窗体,它有一个按钮,可以在datagrid上打开主客户。我使用dataview是为了使用dataview.rowfilter过滤数据。 问题是,在表单加载期间。这需要5-6秒(在此期间程序没有响应)。我试图做的是在后台将数据加载到dataview,并在workercompleted上的gridview上显示它 它给了我以下错误:“创建表单时出错。有关详细信息,请参阅Exception.InnerException。错误是:在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模
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()