backgroundworker抛出“创建表单时发生错误......”

时间:2013-12-09 02:51:35

标签: vb.net multithreading backgroundworker

我的主窗体有一个按钮,可以在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

1 个答案:

答案 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添加到代码文件的顶部。