C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで非同期メソッドを同期メソッドから一時的に呼び出す場合の対処法です。
非同期処理のSetSourceAsyncで取得
非同期処理を行う外部ライブラリやアセンブリの関数やメソッドを利用とすると、こんな警告が表示されます。
この呼び出しを待たないため、現在のメソッドの実行は、呼び出しが完了するまで続行します。呼び出しの結果に ‘await’ 演算子を適用することを検討してください。
で、”await” キーワードを追加すると、必ず表示されるエラーに遭遇します。
“await’ 演算子は、非同期メソッド内でのみ使用できます。このメソッドに ‘async’ 修飾子を指定し、戻り値の型を ‘Task’ に変更することを検討してください。”
特に既存プロジェクトの修正などで、既存のプロシージャーを非同期に変更した場合に数多くの参照先で警告やエラーに対応する労力に見舞われます。
例えば、次のような[Hogehoge]呼び出す[Func]を想定します。
private void Func(string arg1)
{
Hogehoge(arg1);
}
private void Hogehoge(string arg1)
{
//処理
}
プロジェクトを修正して非同期メソッドを利用したい場合[Hogehoge]プロシージャーを[HogehogeAsync]のように非同期呼び出しにする必要があります。
private async Task HogehogeAsync(string arg1)
{
await Task.Delay(1000);
}
[Func]プロシージャー内から[HogehogeAsync]を呼び出すと、警告が表示され
private void Func(string arg1)
{
HogehogeAsync(arg1);
}
警告の説明に従って “await” キーワードを追加するとビルド時にエラーになります。
private void Func(string arg1)
{
await HogehogeAsync(arg1);
}
[変数の破棄]を利用して既存メソッドを流用
C#の[変数の破棄]を利用すると、既存メソッドを活かしたまま非同期処理を呼び出すことが可能になります。
例えば、次のような[Hogehoge]呼び出す[Func]を想定します。
private void Func(string arg1)
{
Hogehoge(arg1);
}
private async Task HogehogeAsync(string arg1)
{
await Task.Delay(1000);
}
このような場合は、[HogehogeAsync]を直接、呼び出す前に[Hogehoge]プロシージャー内に[変数の破棄]を行う処理を追加します。
private void Hogehoge(string arg1)
{
_ = Task.Run(async () =>
{
await HogehogeAsync(arg1);
});
}
“Task.Run(async () =>” を省略して、こんな感じでも表記ができます。
private void Hogehoge(string arg1)
{
_ = HogehogeAsync(arg1);
}
既存プロジェクトで、同期処理の関数やプロシージャーへの呼び出しが沢山ある場合には、呼び出し先のコードを変更する作業が減ります。
開始した非同期処理の終了を知りたい場合は、別記事をご覧ください。
まとめ
今回は、短い記事ですが、WinUI3プロジェクトで非同期メソッドを同期メソッドから一時的に呼び出す場合の対処法について紹介しました。
非同期型のプロシージャー呼び出す場合に[変数の破棄]を利用して中間的なプロシージャーを作成すると、既存コードを変更部分を極力抑えて非同期処理化が可能です。
WinUI 3 アプリで、同期処理から非同期処理に変更した際の警告を非表示にしたい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。
