排队异步函数调用

时间:2014-07-25 11:36:28

标签: c# asynchronous excel-dna

我正在使用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;
            }
        });
    }

1 个答案:

答案 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;
        }

    }