在可以調用 OLE 之前,必須將當前線程設置為單線程單元(STA)模式


在可以調用 OLE 之前,必須將當前線程設置為單線程單元(STA)模式。請確保您的 Main 函數帶有 STAThreadAttribute 標記。 只有將調試器附加到該進程才會引發此異常。

     程序之前運行正常,我只是在一個事件中定義了做了如下操作,程序拋出此異常

 


    private void OnExportPlan(object sender, EventArgs e)
        {
            try
            {
                if (null != ExportPlan)
                {
                    Cursor = Cursors.WaitCursor;
                    saveFileDialog1.Filter = "(Excel2003).xls|*.xls|(Excel2007).xlsx|*.xlsx";
                    if (DialogResult.OK == saveFileDialog1.ShowDialog())
                    {
                        mExportFilePath = saveFileDialog1.FileName;
                        Application.DoEvents();
                        ExportPlan(this, null);
                    }
                }
            }
            finally
            {
                Cursor =  Cursors.Default;
            }
        }


 查看MSDN,有如下說明:

 

  單元是進程內部具有相同線程訪問要求的對象的邏輯容器。同一單元中的所有對象都可以接收從該單元中的任何線程發出的調用。.NET Framework 不使用單元,托管對象自己負責以線程安全的方式使用所有共享資源。

  由於 COM 類使用單元,因此公共語言運行庫需要在 COM interop 的情況下調用 COM 對象時創建並初始化一個單元。托管線程可以創建並進入只允許有一個線程的單線程單元 (STA) 或者包含一個或多個線程的多線程單元 (MTA)。通過將線程的 ApartmentState 屬性設置為 ApartmentState 枚舉值之一,可以控制所創建的單元的類型。由於給定線程只能初始化 COM 單元一次,因此在第一次調用非托管代碼之后就不能更改單元類型。

  成員定義:

     STA:Thread 將創建並進入一個單線程單元。

     MTA:Thread 將創建並進入一個多線程單元

  Unknown:尚未設置 ApartmentState 屬性。

解決辦法兩種:

1) 在Main入口添加STAThread的Attribute

   


[STAThread]
    static void Main() 

 

2)

 


   Thread  app  =  new  Thread(new  ParameterizedThreadStart(ShowWindow));
   app.ApartmentState  =  ApartmentState.STA;

 //也可以
 Thread newThread = new Thread(new ThreadStart(ThreadMethod));
 newThread.SetApartmentState(ApartmentState.MTA); 

 

轉載請注明原創地址:http://www.cnblogs.com/winzheng/archive/2008/12/02/1345656.html

例如:

 


 static void Main()
    {
        Thread newThread = 
            new Thread(new ThreadStart(ThreadMethod));
        newThread.SetApartmentState(ApartmentState.MTA);

        // The following line is ignored since 
        // ApartmentState can only be set once.
        newThread.SetApartmentState(ApartmentState.STA);

        Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", 
            newThread.ThreadState, newThread.ApartmentState);

        newThread.Start();

        // Wait for newThread to start and go to sleep.
        Thread.Sleep(300);
        try
        {
            // This causes an exception since newThread is sleeping.
            newThread.SetApartmentState(ApartmentState.STA);
        }
        catch(ThreadStateException stateException)
        {
            Console.WriteLine("\n{0} caught:\n" +
                "Thread is not in the Unstarted or Running state.", 
                stateException.GetType().Name);
            Console.WriteLine("ThreadState: {0}, ApartmentState: {1}",
                newThread.ThreadState, newThread.GetApartmentState());
        }
    }

    static void ThreadMethod()
    {
        Thread.Sleep(1000);
    }
http://www.cnblogs.com/winzheng/archive/2008/12/02/1345656.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 在可以調用 OLE 之前,必須將當前線程設置為單線程單元(STA)模式 異常錯誤:在可以調用 OLE 之前,必須將當前線程設置為單線程單元(STA)模式 在可以調用 OLE 之前,必須將當前線程設置為單線程單元(STA)模式,請確保您的Main函數帶有STAThreadAttribute標記。 多線程操作剪切板的時候。 在可以調用OLE之前,必須將當前線程設置為單線程單元(STA)模式,請確保您的Main函數帶有STAThreadAttribute 解決“System.Threading.ThreadStateException:“在可以調用 OLE 之前,必須將當前線程設置為單線程單元(STA)模式。請確保您的 Main 函數帶有 STAThreadAttribute 標記。 只有將調試程序附加到該進程才會引發此異常”的異常 C#解決“System.Threading.ThreadStateException:“在可以調用 OLE 之前,必須將當前線程設置為單線程單元(STA)模式。請確保您的 Main 函數帶有 STAThreadAttribute 標記。 只有將調試程序附加到該進程才會引發此異常”的異常 選擇目錄,選擇文件夾的COM組件問題。在可以調用 OLE 之前,必須將當前線程設置為單線程單元(STA)模式。請確保您的 Main 函數帶有 STAThreadAttribute 標記。 只有將調試器附加到該進程才會引發此異常。 如何解決C#異常:必須先將當前線程設置為單線程單元(STA)模式,然后才能進行OLE調用,請確保你的Main函數已在其上標記了STAThreadAttribute 當前線程不在單線程單元中,因此無法實例化 ActiveX 控件 類中調用界面ActiveX控件報錯當前線程不在單線程單元中因此無法實例化 ActiveX 控件的解決辦法
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM