Является ли вызов RPG-программы из C # синхронным или нет? - PullRequest
1 голос
/ 28 июня 2019

Мой код C # вызывает программу в AS400 с cwbx API. Теперь возникает вопрос: является ли этот вызов синхронным? Я имею в виду, вернувшись к своему коду, как я могу быть уверен, что вызванная программа выполнила свою работу?

Кажется, что вызываемая программа выполняет свою работу, но иногда не достаточно быстро, поэтому я подозреваю, что, возможно, вызов асинхронный. Но я не знаю, как работает 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?

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Да, вызов является синхронным.

Документ, на который вы ссылаетесь, не имеет ничего общего с компонентами Active X на клиентском ПК.

Как часть более старой IBMi Access для Windows установить или более новую Access Client Solution - пакет приложений Windows у вас должна быть установлена ​​опция Programmer's Toolkit .

Компоненты ActiveX документированытам enter image description here

0 голосов
/ 28 июня 2019

Вы можете использовать класс 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();
    }
...