首页 > 解决方案 > 从 C# 对 RPG 程序的调用是否同步?

问题描述

我的 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 程序的结果?

标签: c#ibm-midrangerpg

解决方案


您可以使用 WaitHandle 类来确保您的代码阻塞,直到 .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();
    }

推荐阅读