C# - asyncで「CS1998:この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。」が発生する。

async を削除するか、Task.CompletedTask メソッドで正常終了のタスクを生成して非同期実行します。

エラーの原因

async 修飾子は、そのメソッド(関数)が非同期であることを指定します。メソッド中にタスクの待機処理(await)がない場合 async 修飾子を指定する意味が無いため、エラーが発生します。

警告の発生するコード例

// CS1998 この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。
async Task<int> testAsync()
{
    return 100;
}

エラーメッセージ

CS1998	この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。
'await' 演算子を使用して非ブロッキング API 呼び出しを待機するか、
'await Task.Run(...)' を使用してバックグラウンドのスレッドに対して
CPU 主体の処理を実行することを検討してください。
警告が発生している様子
警告が発生している様子

解決方法1 async を削除する。

async を削除し、Task<xxx> を xxx に変更します。プログラムの構成上 async を削除できない場合は 解決方法2 を参照してください。

修正前のコード

async Task<int> testAsync()
{
    return 100;
}

修正後のコード

// async を削除し、Task<int> を int にする。
int testAsync()
{
    return 100;
}

解決方法2 Task.CompletedTask メソッドで正常終了のタスクを生成し、非同期実行する。

メソッド(関数)内に次の1文を追加します。return の前であればどこでも構いません。
// 次の1文を追加
await Task.CompletedTask;

// デッドロックを防止したい場合はこちら
await Task.CompletedTask.ConfigureAwait(false);

修正後のコード

// Task.CompletedTask で正常終了のタスクを生成し、非同期実行する。
async Task<int> testAsync()
{
    await Task.CompletedTask.ConfigureAwait(false);

    return 100;
}
※.NET Framework4.6よりも古い場合、この方法は使用できません。解決方法3 を参照してください。

解決方法3 Task.FromResult メソッドでタスクを生成し、非同期実行する。

return 行を次のように修正します。
// Task.FromResult で Task を生成し、await実行。
return await Task.FromResult(戻り値);

// デッドロックを防止したい場合はこちら
return await Task.FromResult(戻り値).ConfigureAwait(false);

修正後のコード

// Task.FromResult で Task を生成し、非同期実行する。
async Task<int> testAsync()
{
    return await Task.FromResult(100).ConfigureAwait(false);
}

戻り値の型が void の場合、次の記事を参照してください。

C# - await で「CS4008 void を待機することができません」エラーが発生する。

検証環境