2016-11-14 9 views
1

私はTaskTask<T>を返すメソッドを公開するサードパーティ製のDLLを使用しています。私はこのアセンブリまたはインターフェイスを制御することはできません。私は、メソッドの名前がAsync()であるため、すべてが非同期である必要があると仮定しました。非同期コードがない場合、タスクを返すサードパーティのインターフェイスをどのように処理しますか?

実際、非同期コードが実行されていない場合、どのようにインターフェイスを適切に実装すればよいですか?さらに

public class FooBar : IFoo 
{ 
    public async Task DoWorkAsync() 
    { 
     // Do Some Work 

     await Task.Yield(); 
    } 

    public async Task<int> GetValueAsync() 
    { 
     // Do Some Work 
     var result = ...; 

     return Task.FromResult(result); 
    } 
} 

public interface IFoo 
{ 
    Task DoWorkAsync(); 

    Task<int> GetValueAsync(); 
} 

私の試みは、以下の通りであった著者がTask/Task<T>を返されたメソッドのみを露出させ、正しい

  • ましたか?
  • * Async()で接尾辞のメソッド名が正しく書かれていましたか?名前にAsyncを追加せずに非同期メソッドを記述すると、コード解析はエラーになりません。
+2

私は 'Async'メソッドを呼び出すと「はい」と答えるでしょう。それをはっきりと簡単にします。あなたがアップグレードしていて、 'GetSomething'と' GetSomethingAsync'メソッドを持つように後方互換性を保つためにしようとしているとき。 – rbm

+0

私は一般にあなたの2つのアプローチの前者を行います。待っていることが何もないなら、待つことは何もありません。不必要だと思われますが、第三者の図書館は彼らのものです。 – David

+0

@David:2つの方法がありますが、どちらかが技術的にリターンを持たないため、タスクではなく単にタスクになっています。 – michael

答えて

3

非同期処理を行わない場合は、asyncキーワードを含めないでください。 GetValueAsnycの機能はほぼ正確でしたが、asyncを削除するだけでした。 DoWorkAsyncの場合は、メソッドasyncをマークして、完了したタスクを返すだけで済みます。あなたのコードが遅いですし、私はあなたができるかどうかに見て検討する時間の長い期間のためのUIをブロックしてしまう場合

public class FooBar : IFoo 
{ 
    public Task DoWorkAsync() 
    { 
     // Do Some Work 

     //If you can use .NET 4.6 
     return Task.CompletedTask; 

     //For older versions, the thing you pass in does not matter, I like to use bool. 
     return Task.FromResult(false); 
    } 

    public Task<int> GetValueAsync() 
    { 
     // Do Some Work 
     var result = ...; 

     return Task.FromResult(result); 
    } 
} 

しかし、実際には非同期であることや、おそらくコードをラップしてコードを再書き込みバックグラウンドスレッドでは、私は最後の手段だった場合、私はバックグラウンドスレッドを行うだろう。

関連する問題