[解決済み】C#でValueTask<T>ではなくTask<T>を使用するのはなぜですか?
疑問点
C#7.0から、非同期メソッドはValueTask<T>を返すことができるようになりました。説明では、キャッシュされた結果があるときや、同期的なコードで非同期をシミュレートするときに使用するようにとあります。しかし、ValueTaskを常に使うことの何が問題なのか、実際、なぜasync/awaitが最初からvalue型で作られていないのか、私にはまだ理解できていません。ValueTaskが仕事をしないのはどんな場合でしょうか?
解決方法は?
から API ドキュメント (強調)。
<ブロッククオート
メソッドは、操作の結果が同期的に利用できる可能性が高い場合、この値型のインスタンスを返すことがあります。
そして
メソッドが頻繁に呼び出されることが予想され、そのために新しい
Task<TResult>
を呼び出すことは、法外な負担となる。
を使用することにはトレードオフがあります。
ValueTask<TResult>
の代わりに
Task<TResult>
. 例えば
ValueTask<TResult>
は、成功した結果が同期的に利用可能である場合に、割り当てを回避するのに役立ちますが、2つのフィールドを含んでいます。
Task<TResult>
を参照型とした場合、1つのフィールドとなります。これは、メソッド呼び出しが1つではなく2つのフィールドに相当するデータを返すことになり、コピーするデータが多くなることを意味します。また、もしこのうちのひとつを返すメソッドが
async
メソッドのステートマシンは、その
async
メソッドは、1 つの参照ではなく 2 つのフィールドである構造体を格納する必要があるため、サイズが大きくなります。
さらに、非同期処理の結果を消費する以外の用途で
await
,
ValueTask<TResult>
は、より複雑なプログラミングモデルにつながる可能性があり、その結果、実際にはより多くのアロケーションにつながる可能性があります。たとえば、あるメソッドが
Task<TResult>
キャッシュされたタスクを共通の結果として持つか、あるいは
ValueTask<TResult>
. 結果の消費者が、その結果を
Task<TResult>
のようなメソッドで使用するような場合です。
Task.WhenAll
と
Task.WhenAny
を使用します。
ValueTask<TResult>
に変換する必要があります。
Task<TResult>
を使って
AsTask
これは、キャッシュされた
Task<TResult>
が使用されていた。
このように
非同期メソッドでは、デフォルトで
Task
または
Task<TResult>
. パフォーマンス分析によって価値があることが証明された場合にのみ
ValueTask<TResult>
の代わりに使用されます。
Task<TResult>
.
関連
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] C#でHashtableよりDictionaryが好まれる理由とは?
-
[解決済み] C#で同期メソッドから非同期メソッドを呼び出すには?
-
[解決済み] Reduxの非同期フローになぜミドルウェアが必要なのか?
-
[解決済み] 非同期Task<T>メソッドを同期的に実行するにはどうしたらいいですか?
-
[解決済み] await/asyncを使用しているときにHttpClient.GetAsync(...)が返らない
-
[解決済み】なぜFunc<T>ではなくExpression<Func<T>を使うのですか?
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み】非同期処理の待ち時間、Wait()でプログラムがフリーズする原因はここにある
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】C#で四捨五入する方法
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】Nullableオブジェクトは値を持たなければならない?