0

C# で Excel 用の UDF ライブラリを作成中です。UDF を長時間実行するので、UDF を非同期にして、UDF の呼び出し中に Excel UI を引き続き使用できるようにします。以下は私のコードです。しかし、生成されたスレッドからExcelを呼び出すときに失敗します...

[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
[ComDefaultInterface(typeof(IRAPDataAddIn))]
public class RAPDataAddIn : IRAPDataAddIn
{

    public string GetPositionData(Excel.Range Portfolios, Excel.Range Security)
    {





        Excel.Application excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");

        Excel.Range target = (Excel.Range)excelApp.get_Caller(System.Type.Missing);


        Thread _workerThread = new Thread(new ParameterizedThreadStart(this.GetData));
        _workerThread.CurrentCulture = System.Globalization.CultureInfo.CurrentCulture;
        _workerThread.CurrentUICulture = System.Globalization.CultureInfo.CurrentUICulture;

        _workerThread.Start(target);

        return "Getting Data";
    }


    public void GetData(object Range)
    {
        Excel.Range target = Range as Excel.Range;

        Thread.Sleep(1000);

        object[,] returnData = new object[2,2];

        returnData[0, 0] = " FirstThread";       
        returnData[0, 1] = " SecondThread"; 
        returnData[1, 0] = " ThirdThread";              
        returnData[1, 1] = " FourthThread";  

        var Start = (Excel.Range)target.Worksheet.Cells[1,1];
        var End = (Excel.Range)target.Worksheet.Cells[2,2];

        Excel.Range r = (Excel.Range)target.Worksheet.Range[Start, End];

        try
        {
            r.Value2 = returnData; ***//It fails here***
        }
        catch (Exception ex)
        {

        }
    }
4

1 に答える 1

2

(免責事項: 私は Excel-DNA ライブラリを開発しています)

(無料の) Excel-DNAライブラリを使用して Excel UDF を実装することをお勧めします。最近、非同期関数の実験的なサポートを追加したので、試してみるには良い時期です。現在の非同期関数サポートの最初の概要をここに置きます: http://exceldna.codeplex.com/wikipage?title=Asynchronous%20Functions&referringTitle=Documentation。Excel-DNA のサポートに最適な場所は、Excel-DNA Google グループです。

あなたのアプローチにはいくつかの潜在的な問題があります。

  • 取得する Application オブジェクトMarshal.GetActiveObjectは、実行している Excel インスタンスではない可能性があります。複数の Excel インスタンスが開始されている場合は、最後に開始された Excel になります。

  • 'Range' COM オブジェクトを別のスレッドに渡すことはできません。これは STA アパートメントにバインドされたオブジェクトであるため、明示的なクロススレッド マーシャリングなしでは、メインの Excel スレッドではないスレッドから使​​用することはできません。

  • 他のスレッドから Excel への COM 呼び出しは、Excel がビジーである場合 (たとえば、Excel が計算でビジー状態である場合、ユーザーがセルを編集している場合、またはマウス ボタンを押しただけの場合) に失敗する可能性があります。そのため、すべての COM 呼び出しは、通常の操作の一部として発生する可能性のある例外を処理する必要があります。

この種の作業を Excel-DNA で実装する方法はいくつかあるため、より具体的なガイダンスが必要な場合は、ライブラリを確認し、Google グループに投稿してください。

于 2012-06-27T13:47:37.527 に答える