2016-05-18 6 views
0

Я запускаю ArrayFormula асинхронно, используя ExcelAsyncUtil.Run. Эта формула содержит около 20 столбцов и 1000-5000 строк.Async ArrayFormula все еще замораживает 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 async основана на функции RTD от Excel. RTD не работает, когда вызывается из формулы массива.

Я предлагаю вам разделить свою функцию на функцию async, которая возвращает один «дескриптор» (при внутреннем хранении данных в словаре или что-то еще) и вторую (не-асинхронную) функцию, которая распаковывает эти данные, беря дескриптор как ввод и возврат массива из внутреннего хранилища.

Это немного более неудобно использовать, так как вам нужна дополнительная ячейка для хранения ручки, но она будет намного надежнее.

+0

Спасибо, Говерт. Так я использовал это. Я немного обеспокоен утечками памяти. Знаете ли вы о простом способе очистки словаря, если ячейка, вызывающая функцию async, изменилась? – Samuel

+0

Вместо использования ExcelAsyncUtil.Run используйте ExcelAsyncUtil.Observe с IObservable, тогда Dispose будет надежно разрешать вам очистку. См. Эту надставку в качестве примера: https://github.com/ratesquant/ACQ/tree/master/ACQ.Excel/Handles – Govert

 Смежные вопросы

  • Нет связанных вопросов^_^