1

相互運用機能を介してMicrosoftExcelを開くアプリケーションを作成しています。

私が抱えている問題は、アプリケーション自体がロックアップしたり、メモリリークが発生したりすると、アプリケーションがブロックされ、スレッドを続行できないことです。

ディレクトリを調べて各ファイルのループに書き込む親スレッドがあります

Convert( "src.xls"、 "src.pdf"、null); また、たとえば、Excelにファイルの種類を指定すると、開くことができず、ロックされると言われることがあります。これによりスレッドがロックされ、プロセスを強制終了する必要があります。

public static class ExcelConverter
{
    public static bool Convert(string srcFile, string destinationFile, object[] parameters)
    {
        bool bStatus = false;
        Workbook excelWorkBook = null;
        Excel.Application application = null;

        try
        {


        application = new Excel.Application();
        object missingParam = Type.Missing;


            excelWorkBook = application.Workbooks.Open(srcFile);

            if (excelWorkBook != null)
            {
                excelWorkBook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, destinationFile);
            }
            bStatus = true;
        }
        catch (Exception)
        {

            bStatus = false;
        }
        finally
        {
            if (excelWorkBook != null)
            {
                excelWorkBook.Close(false);
                excelWorkBook = null;
            }

            if (application != null)
            {
                application.Quit();
                application = null;
            }

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

        return bStatus;
    }
}
4

2 に答える 2

3

たとえば、Excelにファイルタイプを指定すると、開くことができず、ロックされます。

おそらく、ユーザーにそのことを知らせるダイアログを表示しようとしています。実際にダイアログが表示されるように、application.Visible=trueを設定してこれをデバッグします。Open()呼び出しでさらに引数を指定して修正します。Password、Notify、CorruptLoad引数が有効です。ファイルをより適切にスクリーニングすることは明らかな回避策です。Excelは実際にはインタラクティブで問題についておしゃべりになるように設計されています。

スレッドを恐れる必要はあまりありません。ExcelはシングルスレッドのCOMオブジェクトであり、COMはインターフェイスメソッドがスレッドセーフな方法で呼び出されるようにします。これは、相互運用オブジェクトに安全なホームを提供するために実際に新しいスレッドを作成することによって、あなたの場合に行われます。

于 2012-06-01T12:18:08.947 に答える
2

ここでは、変換を行うためにMarshalByRefObject新しいオブジェクトを生成できるオブジェクトを拡張するオブジェクトを作成することができます。AppDomain完了したら、をアンロードするだけでAppDomain、すべてのメモリがクリアされます。

于 2012-06-01T14:49:30.127 に答える