私はインターフェースを持っています
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.Run
TaskEx.Run
インターフェイスから非同期メソッドを実装する必要があり、実装が同期している場合は、Nedのソリューションを使用できます。
public Task<Bar> CreateBarAsync()
{
return Task.FromResult<Bar>(SynchronousBarCreator());
}
このソリューションでは、メソッドは非同期に見えますが、同期しています。
またはあなたが提案した解決策:
Task<Bar> CreateBarAsync()
{
return Task.Run(() => SynchronousBarCreator());
}
このように、メソッドは本当に非同期です。
「タスクを返すインターフェイスメソッドを実装する方法」のすべてのケースに一致する一般的なソリューションはありません。コンテキストによって異なります。実装は十分に高速なので、別のスレッドで呼び出すのは無意味ですか?このメソッドが呼び出されると、このインターフェイスはどのように使用されますか(アプリがフリーズしますか)?別のスレッドで実装を呼び出すことも可能ですか?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加