2016-03-21 13 views
0

私は、顧客データを取得するのに時間がかかる可能性のある機能を持つ既存のDLLを持っています。今まではUIのロックを防ぐために良い古いthreading.thread.startメソッドを使用していましたが、私は.net 4.5のAwait/Asyncメソッドを頭に入れようとしていました。 これらの関数の周りにAwaitラッパーを作成する簡単な方法はありますか?私はdllを4.5に更新できますが、コード自体の構造を変更することはできません。すべて私がのエラーに結果を試してみてください。.. ブール.net既存の/古いコードで待つ

例のコードは「適しGetAwaiterメソッドを持っている 『』待っていますが、その型を必要とし」....私は理解していない何

Public Async Function GetByID(id As Integer) As Task(Of Boolean) 
     'serviceBase is a dll with a number of functions for getting 
     'data that returns true when a customer object has been filled 
     Return Await ServiceBase.GetCustomer(id) 
    End Function 

があります私がServiceBaseでGetCustomerを更新できるのであれば、それを非同期としてマークし、(Booleanの)タスクを返さなければなりません。しかし、GetCustomerはいつでもAwaitを使用する必要がないため、エラーが発生します。これは、ブロックされたUIに合計で追加される多数の小さなプロセスです。

+0

は、実際には非同期操作を、顧客を得るための行為ですか?同期メソッド 'Async'を作成することに意味はありません。代わりにGetCustomerにコードを表示できますか?この場合、もっと面白いです。 「ブール などの公共機能GetCustomer(整数としてID)GetFromSourceA(ID)なら、 」 – kai

+0

その関数の例(顧客は、例えばソースA&Cの詳細を持つことができる) は、顧客とのいくつかの作業を行うと、真 を返します 場合GetFromSourceB(ID)が続い は「顧客とのいくつかの作業を行うと 場合GetFromSourceC(ID)が続い がいる場合、真 終了を返すの顧客とのいくつかの作業を行うと 場合IsNothing(顧客)次に戻るならば真 終了を返すと終了False Trueを返す 終了関数 ' – user3334804

+0

@kaiとは、それが 'GetCustomer'タスクを返し、 'Await GetCustomer'を呼び出すことは自動的に非同期にすることではありません。 'async/await'は、*すでに*非同期メソッドのために*待っている構文砂糖です。たとえば、 'GetCustomer'がWebサービスを呼び出す場合、' Await client.CallThatMethodAsync'を使用して非同期にサービスメソッドを呼び出し、 'client.CallThatMethod'を同期的に呼び出すのではなく結果を得ることができます。 DBアクセスメソッドの場合は、ExecuteReaderの代わりにExecuteReaderAsyncを使用することができます –

答えて

0

非同期ラッパーを使用するメソッドが本当に非同期ではない場合、たとえば実際にはI/Oではなく、デスクトップアプリケーションのUIをブロックする長期間にわたるプロセスで、実際の呼び出しをAwait Task.Run(Function()ServiceBase.GetCustomer(id))のdllメソッド。 asp.netアプリケーションの場合は、同期操作を同期させます。

偽の非同期ラッパーを作成して、Task.Runを呼び出すことによってdllに追加することをお勧めします。何かがCPUにバインドされていてUI(デスクトップアプリケーション)をブロックしている場合は、特定のアプリケーションコンテキストでTask.Runを呼び出すだけで、dllに偽の非同期実装を作成しないでください。ここではいくつかの素晴らしいリソースが問題にステファン・クリアリーである:

Stephen Cleary's Blog on Task.Run

+0

完全に感謝します。私がDLLに触れたくない主な理由は、同期機能を維持したいと思っていて、それを変更するのが正しいとは思わなかったからです。リソースは私の考えを確認しています。これは悪い習慣になるので、フェンスのUI /アプリケーション側のTask.RunでAsyncに変更するとうまく動作します。私が終わりには、理解しやすい/読んでいるコードを持っていること以外は、実際には価値のある仕事のように見えるものを書き直しているので、それほど多くはありませんでした。 – user3334804

+0

完全に理解してください。私は最近、同様の響きのシナリオでデスクトップアプリケーションを使って作業しました。 – davidallyoung

関連する問題