先に進み、次のような機能があるとしましょう。
public class Test
{
public async Task Finalize()
{
// We don't need this in this class, so empty body
}
/*
* Additional methods snipped
*/
}
これは問題なく動作しますが、次のようなコンパイラの警告が表示されます。
この非同期メソッドには 'await'演算子がなく、同期的に実行されます。ブロッキングのないAPI呼び出しを待つために 'await'演算子を使用するか、またはバックグラウンドスレッドでCPUバウンドの作業を行うために 'await Task.Run(...)'を使用することを検討してください。
方法をあまり変更せずにこの警告を回避するための最善の方法は何でしょうか。この場合、メソッドが呼び出されるため、例外をスローすることはできませんが、この時点では絶対に何も起こらないということです。
ファイルに次のディレクティブを置くことができます。
#pragma warning disable 1998
しかし、私は警告をそのままにして、そのアドバイスを受けることをお勧めします。それは正当な理由のための警告です。
編集:あなたが1つの方法だけのために警告を無効にしたい場合は、これを行うことができます:
#pragma warning disable 1998
async Task Foo() {}
#pragma warning restore 1998
このようにすると、コンパイラが警告を発するのではなく、警告が表示されなくなります。
あなたがそのようなコンパイラの警告を回避する必要があるなら、興味のある人のために:
public async Task DoStuff
{
// This method should stay empty
// Following statement will prevent a compiler warning:
await Task.FromResult(0);
}
async
そしてそのawait
上記の回答から、同じシグネチャに一致し、最適化されないような無意味なコードを生成しません。 - Jon Hanna
これは、非同期インターフェース用に同期(またはnoop)実装をしているときには、よくある問題です。
あなたが実装することができますTask
なしでの復帰方法async
完成したキーワードを返すだけのキーワードTask
、 など:
public Task FinalizeAsync()
{
return Task.FromResult(0);
}
しかし、これでもまだTask
それが呼ばれるたびに。あなた自身がこれをたくさんやっているのを見つけた場合、あなたは完成したものをキャッシュしたいかもしれませんTask
インスタンス。私のAsyncExライブラリはたくさんのタスク定数この目的のために:
public Task FinalizeAsync()
{
return TaskConstants.Completed;
}
最後に、あなたは私のブログ記事を見てみるとよいでしょう。非同期処理いくつかの代替アプローチがあります。
async
は実際のメソッドのシグネチャの一部ではないため、コードの呼び出しやインターフェイスのマッチングに影響はありません。完璧にすることができます。) - Jon Hannaasync
。 - Toby J
以前の.NET 4.6では、ダミー値を返す必要がありましたが、これは必要ありません。しかし、これで次のようにできます。
public async Task MyFunctionAsync()
{
// Some works here...
await Task.CompletedTask;
}
"async"を削除すると警告は消えます。
public class Test
{
public void Finalize()
{
// We don't need this in this class, so empty body
}
}
async
、public
と一緒に使用することはできませんinterfaces
- Sriram Sakthivel