排队异步函数调用

本文关键字:函数调用 异步 排队 | 更新日期: 2023-09-27 18:14:53

我使用excel - dna来运行异步excel函数调用。我的excel函数通过一个通信接口调用R。

据我所知,通信接口不能异步调用,必须同步调用。我担心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;
            }
        });
    }

排队异步函数调用

[methodimpll (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;
        }
    }