我的主窗体有一个按钮,可以在datagrid上打开一个主客户。我使用dataview来使用dataview.rowfilter过滤数据。 问题是,在表单加载期间。这需要5-6秒(程序在此期间没有响应)。我要做的是将数据加载到背景上的数据视图,并在workercompleted上的gridview上显示。
它给了我这个错误:“创建表单时出错。有关详细信息,请参阅Exception.InnerException。错误是:在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。确保你的Main函数标有STAThreadAttribute。“ - >在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
答案 0 :(得分:0)
您是否尝试将代码移至事件Form_Shown?
另外,您是否尝试将代码放入SyncLock中的DoWork部分?
试试这个:
SyncLock mydataview
mydataview = New DataView(datatablecust)
End SyncLock
至于STA模型...尝试将其添加到您的代码中并将启动对象设置为Sub Main()
<STAThread()> _
Public Shared Sub Main()
Dim mainForm As New custcall()
Application.Run(mainForm)
End Sub
编辑:
就调用而言。 ......这肯定也会奏效......但我不知道它会解决STAThread问题。
要使用调用,首先必须在表单中声明一个委托子:
Delegate Sub LoadDataCallback()
声明一个函数来处理数据的实际加载:
Private Sub LoadData()
mydataview = New DataView(datatablecust)
End Sub
然后,您将在Shown事件(或Load事件)中启动一个新线程:
Dim mythread As New Thread(Sub()
Dim callLoad As New LoadDataCallBack(LoadData)
Me.Invoke(callLoad)
End Sub)
mythread.Start()
这可以使用SyncLock(尽管在某些情况下,如果它不能最终正常工作,你可能会想要这样做。)
不要忘记将Imports System.Threading添加到代码文件的顶部。