2016-05-18 4 views
0

ExcelAsyncUtil.Runを使用して非同期にArrayFormulaを実行しています。この数式には約20列と1000〜5000行があります。非同期ArrayFormulaはまだExcelをフリーズします

それでも私のExcelはフリーズしていますが、ExcelDNAが変換して「待っている」メッセージを表示していると思います。どのように私はこれをリファクタリングしてより良く動作させることができますか?

ここにいくつかのサンプルコードがあります。

[ExcelFunction(
     Name = "MySlowFunction", 
     Description = "...", 
     IsHidden = false)] 
    public static object MySlowFunction(DateTime reportDate, object[,] filters) 
    { 
     var result = ExcelAsyncUtil.Run("MySlowFunction", 
      new object[] { reportDate, filters }, 
      () => 
      { 
       try 
       { 
        return // Run slow query to server here.... 
       } 
       catch (Exception asyncError) 
       { 
        return new object[,] { { asyncError.Message } }; 
       } 
      }); 

     return ParseResult(result); 
    } 


    public static object ParseResult(object result) 
    { 
     if (result.Equals(ExcelError.ExcelErrorNA)) 
     { 
      return "Wait..."; 
     } 
     else 
     { 
      return result; 
     } 
    } 

答えて

1

Excel-DNA非同期実装は、ExcelのRTD機能に基づいています。 RTDは配列式から呼び出されたときにうまく機能しません。

私はあなたの関数を、単一の 'ハンドル'(辞書や何かの内部にデータを格納している間)とそのデータを展開する2番目(非同期)の関数を返す非同期関数に分割し、ハンドル入力として配列を返し、内部ストアから配列を返します。

ハンドルを保持するために余分なセルが必要になるため、もう少し不便ですが、はるかに信頼性が高くなります。

+0

ありがとうGovert。これは私がこれを実装するために使用した方法です。私はメモリリークが少し心配です。非同期関数を呼び出すセルが変更された場合、辞書をクリアする簡単な方法を知っていますか? – Samuel

+0

ExcelAsyncUtil.Runを使用する代わりに、IObservableでExcelAsyncUtil.Observeを使用すると、Disposeは確実にクリーンアップできます。このアドインを例として参照してください:https://github.com/ratesquant/ACQ/tree/master/ACQ.Excel/Handles – Govert

関連する問題