2017-10-10 41 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();});這工作! –