Я запускаю 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;
}
}
Спасибо, Говерт. Так я использовал это. Я немного обеспокоен утечками памяти. Знаете ли вы о простом способе очистки словаря, если ячейка, вызывающая функцию async, изменилась? – Samuel
Вместо использования ExcelAsyncUtil.Run используйте ExcelAsyncUtil.Observe с IObservable, тогда Dispose будет надежно разрешать вам очистку. См. Эту надставку в качестве примера: https://github.com/ratesquant/ACQ/tree/master/ACQ.Excel/Handles – Govert