2017-10-10 36 views
0

我们有一个系统以单线程语言(DataFlex)运行,并通过COM调用C#代码。一个这样的调用需要几秒钟才能完成,并且能够让C#方法在后台完成而不会阻塞UI是非常好的。通过COM从单线程编程语言运行C#异步方法

虽然我的第一次尝试没有在后台完成,但AsyncDbLoad似乎必须在将控制权返回给DataFlex之前完成其工作。

private async Task DbLoad() 
    { 
    LongRunningMethod(); 
    } 

    public async Task AsyncDbLoad() 
    { 
    await DbLoad(); 
    } 

我在做什么错?甚至有可能使用异步等待来做到这一点?不是,我该怎么办?

+0

您使用的是什么版本的dataflex? – AlexDev

+1

本身在方法上抛出'async Task'什么也不做。你必须在你的函数中有一个'await'以获得实际的异步行为。 –

+0

@AlexDev我在版本15.1中测试了它,但它应该与版本19中的版本相同 –

回答

3

我不熟悉这个版本的DataFlex,但我不认为使用异步等待会帮助你。我将它分成2个请求:

1:int StartDbLoad():启动操作,返回操作ID。

2:Result CheckResult(int operationId):检查结果是否可用并检索它。

在C#端,您可以使用Task在单独的线程中处理请求,并将结果保存在Dictionary<int, Result>中。 然后,您必须使用DataFlex中提供的任何功能在保持UI响应的同时轮询结果,例如定时器。

+0

我尝试使用Task.Run((=){ LongRunningMethod();});这工作! –