2016-05-18 60 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無法正常工作。

我建議你把你的函數分解成一個異步函數,它返回一個'句柄'(在內部存儲數據到字典或其他東西)和第二個(非異步)函數,解包數據,作爲輸入並從內部商店返回數組。

使用起來有點不方便,因爲您需要一個額外的單元來容納手柄,但會更加可靠。

+0

謝謝Govert。這是我用來實現這一點的方式。我有點擔心內存泄漏。如果調用異步函數的單元格被更改,您是否知道清除字典的簡單方法? – Samuel

+0

而不是使用ExcelAsyncUtil.Run,​​使用ExcelAsyncUtil.Observe與IObservable,那麼Dispose將可靠地讓您清理。以此加載項爲例:https://github.com/ratesquant/ACQ/tree/master/ACQ.Excel/Handles – Govert