2017-05-24 12 views
1

データをUSBデバイスに送信し、応答を待つC++ DLLを持っています(最大10秒)。このコールバックにはビルドがありませんDLL。これをUIスレッドから呼び出すと、明らかにUIがロックされます。非同期関数で非長時間バインディングの同期APIをラップする

私は現在、私はシンクの上にしかし、推奨されません非同期(async)私はこれを達成するための他の方法を見ていないことを読んだ

public async Task<USBResult> GetData(int command){ 

    //The real function has C#/C++ interop code to marshal the memory and free it. 
    USBResult result; 

    //This function most likely calls Thread.Sleep whilst it waits for a callback internally. 
    //I know it uses FTDIx.dll to do the USB calls. 
    await Task.Run(() result = LongRunningDllCallWithNoCallback(command)); 

    return result; 
} 

DLLの呼び出しなどをラップC#で、このC++ライブラリの非同期ラッパーを書かれています私の場合の機能性私はC++のDLLを変更することができず、開発者は15年前に書かれたSAE標準に準拠していなかったため、変更された場合には他のアプリケーションを破壊することになります。

この悪い習慣ですか?もしそうなら、この長い実行同期dll呼び出しで非同期関数を作成するのに好ましい方法は何でしょうか?

答えて

2

非同期オーバーシンクは推奨されていませんが、私のケースではこの機能を実現する方法は他にありません。

正解です。

お使いの場合には

- あなたは非同期で行うことができない何かを持っている - あなたは、同期APIを公開する必要があり、例えば:時間はUIからそれを呼び出すことが権利であるときに

public USBResult GetData(int command) { 
    // C#/C++ interop code to marshal the memory and free it. 
    USBResult result; 
    result = LongRunningDllCallWithNoCallback(command); 
    return result; 
} 

をそして、その後、を呼び出すことのような、await Task.Runを使用して:この背後にある理由の詳細については

var response = await Task.Run(() => GetData(command)); 

を、私のブログの記事Task.Run in the implementationを参照してください。

+0

私は実際に読んだ後にあなたが示唆したことはお勧めできませんでした。あなたのブログはそれをうまく説明します、ありがとう。 – rolls

関連する問題