web-dev-qa-db-ja.com

何のためにTask.CompletedTaskを待ちますか?

Build2017で導入された Windows Template Studio でUWPアプリを作成しました。

以下のクラスは、それから生成されたコードの一部です。

public class SampleModelService
{
    public async Task<IEnumerable<SampleModel>> GetDataAsync()
    {
        await Task.CompletedTask; // <-- what is this for?
        var data = new List<SampleModel>();

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 1",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.Globe
        });

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 2",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.MusicInfo
        });
        return data;
    }
}

私の質問は、ここにawait Task.CompletedTask;コードの目的と理由は何ですか?実際にはTask結果レシーバーはありません。

17
Youngjae

おそらく、署名を変更せずに非同期コード呼び出しを実装し、呼び出しコードをリファクタリングする必要がないように、後の段階で簡単に実装できるようにするためです。

別のオプションは、メソッドシグネチャとその行からasyncキーワードを削除して、

_return Task.FromResult<IEnumerable<SampleModel>>(data); 
_

たとえば、実装に非同期処理がない場合などに、インターフェイスが原因で待機可能なタスクを返す必要がある場合に、この構造が表示されます。

ただし、この場合はテンプレートなので、_await Task.Completed_をawait FetchDataFromDatabaseAsync();のようなものに置き換えることを期待しています。 asyncキーワードはすでに存在するため、独自の非同期呼び出しを実装するために必要な変更を最小限に抑えます。

とにかく、この待機コンストラクトがなければ、これを行うことができます:

_public class SampleModelService
{
    public Task<IEnumerable<SampleModel>> GetDataAsync()
    {
        var data = new List<SampleModel>();

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 1",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.Globe
        });

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 2",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.MusicInfo
        });

        return Task.FromResult<IEnumerable<SampleModel>>(data); 
     }
}
_

タスクを返す必要がない場合(非同期コードがない場合)は、タスクを完全に削除します。 (しかし、このメソッドを呼び出すコードをリファクタリングする必要があります)

このコードを確認すると、誰かが開発プロセスの後半で非同期メソッドを呼び出すのではないかと疑っています。このメソッドがTaskを返すことを指定することで、すでにそのことを予測していました。

29
Peter Bons