Task <T>を返すインターフェイスメソッドを実装するにはどうすればよいですか?

アンダースグスタフソン

私はインターフェースを持っています

interface IFoo
{
  Task<Bar> CreateBarAsync();
}

作成にはBar、非同期と同期の2つの方法がありますこれら2つのメソッドのそれぞれにインターフェイスの実装を提供したいと思います。

非同期メソッドの場合、実装は次のようになります。

class Foo1 : IFoo
{
  async Task<Bar> CreateBarAsync()
  {
    return await AsynchronousBarCreatorAsync();
  }
}

しかしFoo2同期メソッドを使用して作成するクラスどのように実装する必要がありますBarか?

私は可能性が同期的に実行するメソッドを実装します。

  async Task<Bar> CreateBarAsync()
  {
    return SynchronousBarCreator();
  }

その後、コンパイラはasyncメソッドシグネチャでの使用に対して警告を発します。

この非同期メソッドには「await」演算子がなく、同期的に実行されます。'await'演算子を使用して非ブロッキングAPI呼び出しを待機するか、 'await Task.Run(...)'を使用してバックグラウンドスレッドでCPUバウンド作業を実行することを検討してください。

または、明示的にを返すメソッドを実装することもできますTask<Bar>私の意見では、コードは読みにくくなります。

  Task<Bar> CreateBarAsync()
  {
    return Task.Run(() => SynchronousBarCreator());
  }

パフォーマンスの観点から、両方のアプローチのオーバーヘッドはほぼ同じだと思いますか?

どのアプローチを選択する必要がありますか。asyncメソッドを同期的に実装するか、同期メソッド呼び出しをTask?で明示的にラップします。

編集

私が取り組んでいるプロジェクトは、実際にはMicrosoft AsyncNuGetパッケージのasync / await拡張機能を備えた.NET4プロジェクトです。.NET 4では、に置き換えることができます私は、主要な質問をより明確にすることを期待して、上記の例で.NET4.5メソッドを意識的に使用しました。Task.RunTaskEx.Run

ギヨーム

インターフェイスから非同期メソッドを実装する必要があり、実装が同期している場合は、Nedのソリューションを使用できます。

public Task<Bar> CreateBarAsync()
{
    return Task.FromResult<Bar>(SynchronousBarCreator());
}

このソリューションでは、メソッドは非同期に見えますが、同期しています。

またはあなたが提案した解決策:

  Task<Bar> CreateBarAsync()
  {
    return Task.Run(() => SynchronousBarCreator());
  }

このように、メソッドは本当に非同期です。

「タスクを返すインターフェイスメソッドを実装する方法」のすべてのケースに一致する一般的なソリューションはありません。コンテキストによって異なります。実装は十分に高速なので、別のスレッドで呼び出すのは無意味ですか?このメソッドが呼び出されると、このインターフェイスはどのように使用されますか(アプリがフリーズしますか)?別のスレッドで実装を呼び出すことも可能ですか?

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

非同期Task <T>メソッドを同期的に実行するにはどうすればよいですか?

分類Dev

ASP.Net MVC4コントローラーメソッドからTask <T>を返すメソッドを呼び出すにはどうすればよいですか?

分類Dev

F#でTask <T>を返すC#メソッドを実装する

分類Dev

Task <T>を返すメソッドを実装する適切な方法

分類Dev

<T>が動的である場合、Enumerable <T>の<T>がインターフェイスを実装しているかどうかをテストするにはどうすればよいですか?

分類Dev

Prismで共通のインターフェイスを実装するコレクションIEnumarable <T>としてすべてのインスタンスを挿入するにはどうすればよいですか?

分類Dev

静的ジェネリックメソッドでTのデフォルトタイプを設定するにはどうすればよいですか?

分類Dev

`Class <T>`メソッド内から `T`をインスタンス化するにはどうすればよいですか?

分類Dev

Task <T>ではなくTaskのみを返すメソッドから何を返しますか?

分類Dev

T の反変である Consumer<Optional<T>> を受け入れるメソッドを実装するにはどうすればよいですか?

分類Dev

Task <T>を返すメソッドを作成して同期的に実行できますか?

分類Dev

オブジェクトタイププロパティからメソッドのTを設定するにはどうすればよいですか?

分類Dev

非同期メソッドでTask <T>を返す方法

分類Dev

Tがインターフェースの場合、AutoMoqCustomizationでIFixture.Build <T>()を使用するにはどうすればよいですか?

分類Dev

パターンマッチングを使用して、Tベースからメソッドを呼び出すにはどうすればよいですか?

分類Dev

ClientBase <T>はServiceContractチャネルインターフェイスをどのように実装しますか?

分類Dev

TypeScriptのIterable <T>インターフェースにメソッドを追加することは可能ですか?

分類Dev

Kotlin:ランタイムでOneClass <T>の実際のジェネリック型Tを取得するにはどうすればよいですか

分類Dev

LINQ to SQLフィルターで条件付きでインターフェイスプロパティにアクセスするために、repository <T>のジェネリックTをインターフェイスにキャストするにはどうすればよいですか?

分類Dev

ジェネリックメソッド<T>()からジェネリックList<T>を返すにはどうすればよいですか

分類Dev

リスト内のすべてのアイテムに対してTask.WhenAllを使用してメソッドを実行し、結果を保存するにはどうすればよいですか?

分類Dev

デリゲート `Func <T1、Func <T2、Task <TResult >>>`を `Func <T1、Task <Func <T2、TResult >>`に変換するにはどうすればよいですか?

分類Dev

待機を含むメソッドからTask.FromResult <T>(T result)を使用するのはなぜですか?

分類Dev

異なるタイプのlist <T>を類似のフィールドでグループ化するメソッドに渡すにはどうすればよいですか?

分類Dev

ayncメソッドの呼び出し時にList <T>ではなくTask <List <T >>を返すasyncawait

分類Dev

IEnumerable <T>を返すようにmockRepository returnメソッドを設定するにはどうすればよいですか?

分類Dev

ジェネリック型Tのクラスインスタンスを取得するにはどうすればよいですか?

分類Dev

IEnumerable <T>を実装するにはどうすればよいですか

分類Dev

T-SQLステートメントからデータフローに結果セットを追加するにはどうすればよいですか?

Related 関連記事

  1. 1

    非同期Task <T>メソッドを同期的に実行するにはどうすればよいですか?

  2. 2

    ASP.Net MVC4コントローラーメソッドからTask <T>を返すメソッドを呼び出すにはどうすればよいですか?

  3. 3

    F#でTask <T>を返すC#メソッドを実装する

  4. 4

    Task <T>を返すメソッドを実装する適切な方法

  5. 5

    <T>が動的である場合、Enumerable <T>の<T>がインターフェイスを実装しているかどうかをテストするにはどうすればよいですか?

  6. 6

    Prismで共通のインターフェイスを実装するコレクションIEnumarable <T>としてすべてのインスタンスを挿入するにはどうすればよいですか?

  7. 7

    静的ジェネリックメソッドでTのデフォルトタイプを設定するにはどうすればよいですか?

  8. 8

    `Class <T>`メソッド内から `T`をインスタンス化するにはどうすればよいですか?

  9. 9

    Task <T>ではなくTaskのみを返すメソッドから何を返しますか?

  10. 10

    T の反変である Consumer<Optional<T>> を受け入れるメソッドを実装するにはどうすればよいですか?

  11. 11

    Task <T>を返すメソッドを作成して同期的に実行できますか?

  12. 12

    オブジェクトタイププロパティからメソッドのTを設定するにはどうすればよいですか?

  13. 13

    非同期メソッドでTask <T>を返す方法

  14. 14

    Tがインターフェースの場合、AutoMoqCustomizationでIFixture.Build <T>()を使用するにはどうすればよいですか?

  15. 15

    パターンマッチングを使用して、Tベースからメソッドを呼び出すにはどうすればよいですか?

  16. 16

    ClientBase <T>はServiceContractチャネルインターフェイスをどのように実装しますか?

  17. 17

    TypeScriptのIterable <T>インターフェースにメソッドを追加することは可能ですか?

  18. 18

    Kotlin:ランタイムでOneClass <T>の実際のジェネリック型Tを取得するにはどうすればよいですか

  19. 19

    LINQ to SQLフィルターで条件付きでインターフェイスプロパティにアクセスするために、repository <T>のジェネリックTをインターフェイスにキャストするにはどうすればよいですか?

  20. 20

    ジェネリックメソッド<T>()からジェネリックList<T>を返すにはどうすればよいですか

  21. 21

    リスト内のすべてのアイテムに対してTask.WhenAllを使用してメソッドを実行し、結果を保存するにはどうすればよいですか?

  22. 22

    デリゲート `Func <T1、Func <T2、Task <TResult >>>`を `Func <T1、Task <Func <T2、TResult >>`に変換するにはどうすればよいですか?

  23. 23

    待機を含むメソッドからTask.FromResult <T>(T result)を使用するのはなぜですか?

  24. 24

    異なるタイプのlist <T>を類似のフィールドでグループ化するメソッドに渡すにはどうすればよいですか?

  25. 25

    ayncメソッドの呼び出し時にList <T>ではなくTask <List <T >>を返すasyncawait

  26. 26

    IEnumerable <T>を返すようにmockRepository returnメソッドを設定するにはどうすればよいですか?

  27. 27

    ジェネリック型Tのクラスインスタンスを取得するにはどうすればよいですか?

  28. 28

    IEnumerable <T>を実装するにはどうすればよいですか

  29. 29

    T-SQLステートメントからデータフローに結果セットを追加するにはどうすればよいですか?

ホットタグ

アーカイブ