从 C# 调用 RPG 程序是否同步?

Is a call to a RPG program from C# synchronous or not?

我的 C# 代码使用 cwbx API 调用 AS400 中的程序。 现在的问题是:那个调用是同步的吗?我的意思是,在返回到我的代码时,我如何确定被调用的程序已完成其工作?

似乎被调用的程序完成了它的工作,但有时速度不够快,所以我怀疑调用可能是异步的。但我不知道 cwbx.dll 是如何工作的。 我查看了帮助文档 http://public.dhe.ibm.com/systems/power/docs/systemi/v5r4/en_US/rpc1.pdf 但没有提到同步或异步调用。

cwbx.Program program = new cwbx.Program();
program.LibraryName = Main.GetBIBAS400();
/* ... */
program.Call(parameters);

如果调用是同步的,对我来说一切都很好。可能是这样,因为 API 结构非常简单。 但是如果它是异步的,我可以编写什么代码来等待我的 RPG 程序的结果?

您可以使用 WaitHandle class 来确保您的代码阻塞,直到 .dll 完成处理。

具体来说,查看实现此目的的 WaitOne 方法。示例如下:

    static void Main()
    {
        Console.WriteLine("Main starting.");

        ThreadPool.QueueUserWorkItem(
            new WaitCallback(WorkMethod), autoEvent);

        // Wait for work method to signal.
        if(autoEvent.WaitOne(1000))
        {
            Console.WriteLine("Work method signaled.");
        }
        else
        {
            Console.WriteLine("Timed out waiting for work " +
                "method to signal.");
        }
        Console.WriteLine("Main ending.");
    }

    static void WorkMethod(object stateInfo) 
    {
        Console.WriteLine("Work starting.");

        // Call your external dll here
        program.Call(parameters);

        // Signal that work is finished.
        Console.WriteLine("Work ending.");
        ((AutoResetEvent)stateInfo).Set();
    }

是的,调用是同步的。

您链接到的文档与客户端 PC 上的 Active X 组件无关。

作为较旧的 IBM i Access for Windows 安装的一部分或较新的 Access 客户端解决方案 - Windows 应用程序包 您应该安装 Programmer's Toolkit 选项。

那里记录了 ActiveX 组件