2017-10-10 7 views
0

システムはシングルスレッド言語(DataFlex)で動作し、COM経由でC#コードを呼び出します。そのような呼び出しの1つは完了するまでに数秒かかるので、UIをブロックせずにC#メソッドをバックグラウンドで終了させることができればうれしいでしょう。シングルスレッドプログラミング言語からCOM経由でC#非同期メソッドを実行

私の最初の試みは、バックグラウンドで終了しませんでした。AsyncDbLoadは、DataFlexに制御を戻す前に、作業を完了しなければならなかったようです。

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

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

私は間違っていますか? async-awaitを使用してこれを行うことも可能ですか?そうではありません、どうすればいいですか?

+0

どのようなバージョンのdataflexを使用していますか? – AlexDev

+1

メソッドに対して 'async Task'を単独で投げることは何もしません。 –

+0

@AlexDev私はバージョン15.1でこれをテストしましたが、それはバージョン19で同じでなければなりません –

答えて

3

私はこのバージョンのDataFlexに慣れていませんが、私はasync awaitを使用することはあなたを助けるでしょう。私は2つの要求に分割します:

1:int StartDbLoad():操作を開始し、操作IDを返します。

2:Result CheckResult(int operationId):結果が利用可能かどうかを確認して取得します。

C#側では、Taskを使用して別のスレッドで要求を処理し、結果をDictionary<int, Result>に保存できます。 次に、DataFlexで使用可能な機能を使用して、TimerなどのUIを応答しながら結果をポーリングする必要があります。

+0

私はTask.Run(()=> { LongRunningMethod();});これは動作します! –

関連する問題