我正在使用Excel-DNA来运行异步excel函数调用。我的excel函数通过comm接口调用R.
据我所知,comm接口不能异步调用,必须同步调用。我担心R端的内部状态可能会使这个过程变得复杂,因此我希望能够明确控制excel函数的运行时间。
如何创建队列并且一次只运行一个excel函数,即只要一个就绪,然后我开始运行另一个函数。
并且我确实想要异步运行excel函数,因为它会阻止excel会话被冻结。我明白通过这样做我没有获得任何速度,但它感觉更快"为用户。
以下是我的示例代码:
[ExcelFunction]
public static object AsyncRCallTest(int a1, int a2)
{
return ExcelAsyncUtil.Run("ASyncRCallTest", new object[] { a1, a2 }, delegate
{
try
{
var a = RConnection.Evaluate(a1);
var b = RConnection.Evaluate(a2);
return a + b;
}
catch (Exception err)
{
return err.Message;
}
});
}
答案 0 :(得分:1)
[MethodImpl(MethodImplOptions.Synchronized)]似乎可以解决问题(参见下面的示例代码)。如果有人能证实这一点,我会很高兴。
[ExcelFunction]
public static object AsyncRCallTest(int a1, int a2)
{
return ExcelAsyncUtil.Run("AsyncRCallTest", new object[] { a1, a2 }, delegate
{
return SyncRCallTest(a1, a2);
});
}
[MethodImpl(MethodImplOptions.Synchronized)]
public static object SyncRCallTest(int a1, int a2)
{
try
{
var a = RConnection.Evaluate(a1);
var b = RConnection.Evaluate(a2);
return a + b;
}
catch (Exception err)
{
return err.Message;
}
}