运行 来自单线程编程语言的通过 COM 的 C# 异步方法
Running a C# async method via COM from single threaded programming language
我们有一个使用单线程语言 (DataFlex) 的系统 运行,并通过 COM 调用 C# 代码。一个这样的调用需要几秒钟才能完成,如果能够让 C# 方法在后台完成而不阻塞 UI.
就好了
不过,我的第一次尝试并没有在后台完成 - AsyncDbLoad 似乎必须在将控制权返回给 DataFlex 之前完成其工作。
private async Task DbLoad()
{
LongRunningMethod();
}
public async Task AsyncDbLoad()
{
await DbLoad();
}
我做错了什么?甚至可以使用异步等待来做到这一点吗?不是,怎么办?
我不熟悉此版本的 DataFlex,但我认为使用 async await 对您没有帮助。我会把它分成 2 个请求:
1: int StartDbLoad()
: 发起操作,returns一个操作id。
2: Result CheckResult(int operationId)
: 检查结果是否可用并检索它。
在 C# 端,您可以使用 Task
在单独的线程中处理请求并将结果保存在 Dictionary<int, Result>
中。
然后,您必须使用 DataFlex 中可用的任何功能来轮询结果,同时保持 UI 响应,例如计时器。
我们有一个使用单线程语言 (DataFlex) 的系统 运行,并通过 COM 调用 C# 代码。一个这样的调用需要几秒钟才能完成,如果能够让 C# 方法在后台完成而不阻塞 UI.
就好了不过,我的第一次尝试并没有在后台完成 - AsyncDbLoad 似乎必须在将控制权返回给 DataFlex 之前完成其工作。
private async Task DbLoad()
{
LongRunningMethod();
}
public async Task AsyncDbLoad()
{
await DbLoad();
}
我做错了什么?甚至可以使用异步等待来做到这一点吗?不是,怎么办?
我不熟悉此版本的 DataFlex,但我认为使用 async await 对您没有帮助。我会把它分成 2 个请求:
1: int StartDbLoad()
: 发起操作,returns一个操作id。
2: Result CheckResult(int operationId)
: 检查结果是否可用并检索它。
在 C# 端,您可以使用 Task
在单独的线程中处理请求并将结果保存在 Dictionary<int, Result>
中。
然后,您必须使用 DataFlex 中可用的任何功能来轮询结果,同时保持 UI 响应,例如计时器。