5

これは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コマンドでエラーが発生します。

エラーメッセージは次のとおりです。

OLE 呼び出しを行う前に、現在のスレッドをシングル スレッド アパートメント (STA) モードに設定する必要があります。Main 関数に STAThreadAttribute がマークされていることを確認します。

このフォームは、出力が別のプロジェクトの DLL ファイルであるプロジェクトにあり、この DLL ファイルを使用した別のプロジェクトではエラーは表示されません。どうすれば修正できますか?

4

2 に答える 2

10

このサイトの次のコードを使用しましたが、動作します。

    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;
    }
于 2013-02-19T06:53:40.923 に答える
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を使用すると、これがアプリのメインスレッドではなくワーカースレッドで発生したかどうかを確認するのに役立ちます。

于 2013-01-01T15:01:17.007 に答える