1

ac# Excel 2007 アドインを作成しようとしていますが、「beforeSave」メソッドを「より速く」実行したいと考えています。私は単純にスレッドを使用します(そしてタスクとタスク.ファクトリーも試します)が、常に同じエラーが発生します。

コード。

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    { 
         this.Application.WorkbookBeforeSave += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler(Application_WorkbookBeforeSave);

}// thisAddIn_startup method end
public void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook Wb, bool SaveAsUI, ref bool Cancel)
    {
         backendworker bwfs = new backendworker();// its a custom standalone class!
         Task task1 = new Task(() => bwfs.MyBeforeSave(this.Application.ActiveWorkbook));
         task1.Start();
}// application_workbookbeforesave method end

バックワーカークラス:

public class backendworker
{

    // BeforeSave method
    public void MyBeforeSave(Microsoft.Office.Interop.Excel.Workbook Wb)
    {
          Wb.SaveCopyAs("c:\\temp\\temp.xls");
    }// method end
}// class end

スレッド (任意のタイプ) がなくても大丈夫です。ワークブック全体を保存できます。しかし。マルチスレッドソリューションでは、スローエラーが発生します。( HRESULT からの例外: 0x800AC472 )

私が間違っていることは何ですか?またはそれを修正する方法を考えていますか?:D

4

1 に答える 1

0

複数のスレッドを介して Excel を操作するのは少し難しいです。これに関する MSDN のエントリを次に示します。これは、スレッド アパートメントを使用する COM を介して Excel と対話するためです。ただし、.NET はそうではありません。特に、Excel は Single-Treaded Apartment (STA) を使用します。これは、Excel と対話するために作成されるすべての新しいスレッドを STA 状態に設定する必要があることを意味します。

thread.SetApartmentState(ApartmentState.STA);

Excel を操作する前に。

リンクされた MSDN の記事によると、これでも発生する可能性のある問題の全リストが残ります。全体として、本当に必要でない限り、複数のスレッドで Excel を操作することはお勧めしません。Excel と対話しないバックグラウンド ワーカーには問題はありませんが、バックグラウンド スレッドを介した Excel アプリケーションとの対話は面倒すぎて価値がありません。

于 2012-08-10T22:07:35.040 に答える