c# - 从 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 程序的结果?
解决方案
您可以使用 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();
}
推荐阅读
- c# - 如何自定义 Datagrid 的列(并且只显示几个字段)
- android - 我一直在初始化(据我所知)对象上收到 NullPointerException
- angular - Angular 7 - 向组件 SCSS 文件注入新的 CSS
- python - 初始化 Airflow db 时出现 import _mysql 错误
- three.js - 模型未在屏幕上渲染
- hibernate - Hibernate - 映射问题
- postgresql - 由于子表约束,使用 Entity Framework Core HttpPost 向 Postgres 数据库添加数据失败
- c - connect() 的参数无效
- c++ - 在类声明之前使用
- c - 标准 C 函数在第一次调用时速度较慢,如何正确解决这个问题?