当前线程必须在VB.NET中设置为单线程单元

时间:2013-01-01 12:43:31

标签: .net vb.net

这是我表单中的new方法:

Public Sub New(ByVal ConnectionString As String, ByVal ConSql As SqlClient.SqlConnection, ByVal Daman As Array, ByVal SDate As Integer, ByVal FDate As Integer)

    Threading.Thread.CurrentThread.TrySetApartmentState(Threading.ApartmentState.STA)
    ' This call is required by the Windows Form Designer.
    'Error Appear in this line
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    Me.Sto_TypeFormFrameTableAdapter.Connection.ConnectionString = ConnectionString
    Me.Sto_typeformTableAdapter.Connection.ConnectionString = ConnectionString
    con = ConSql
    com.Connection = con
    ConNew = ConnectionString
    DamaneCod = Daman
    Start = SDate
    Final = FDate
    Fill()
End Sub

当我创建表单的新对象时,InitializeComponent命令会出错。

错误消息是:

  

当前线程必须设置为单线程单元(STA)模式   在进行OLE调用之前。确保您的主要功能   STAThreadAttribute标记在其上。

此表单位于项目中,其输出是另一个项目的DLL文件,并且该错误不会出现在使用此DLL文件的另一个项目中。 我该如何解决?

2 个答案:

答案 0 :(得分:9)

我使用了this site中的以下代码,它可以运行:

    using System.Threading;

    protected void Button1_Click(object sender, EventArgs e)
    {

       Thread newThread = new Thread(new ThreadStart(ThreadMethod));
       newThread.SetApartmentState(ApartmentState.STA);
       newThread.Start();     

    }

    static void ThreadMethod()
    {
       Write your code here;
    }

答案 1 :(得分:7)

不要忽略TrySetApartmentState()的返回值。如果你得到False,那么就没有理由继续尝试,你的代码就无法运行了。你也可以抛出异常。

If Not Threading.Thread.CurrentThread.TrySetApartmentState(Threading.ApartmentState.STA) Then
    Throw New InvalidOperationException("This form is only usable from the UI thread")
End If

当您尝试使用来自控制台模式应用程序的代码或来自不是Winforms或WPF应用程序主线程的线程时,您将收到此异常。这些不是用户界面组件的好客环境。

在启动之前,需要通过应用程序的Main方法上的[STAThread]属性或在启动线程之前调用Thread.SetApartmentState()进入STA公寓的线程。必须调用Application.Run()或Form.ShowDialog()才能获得保持表单功能所需的消息循环。通过查看调用堆栈来调试它,看看如何调用构造函数。使用Debug + Windows + Threads有助于查看是否发生在工作线程而不是应用程序的主线程上。