[解決済み] 私のインターフェースがTaskを返さなければならない場合、操作不要の実装を持つための最良の方法は何ですか?
2022-03-18 14:46:59
質問
以下のコードでは、インターフェイスの関係で、クラス
LazyBar
はそのメソッドからタスクを返さなければなりません (そして議論のために変更することはできません)。もし
LazyBar
このメソッドから No-Operation タスクを返す最良の方法は何でしょうか?
で行っています。
Task.Delay(0)
を呼び出した場合、パフォーマンス上の副作用があるかどうかを知りたいです。
ロット
(議論のために、1秒間に数百回とします)。
- この構文糖は、何か大きなものに巻き戻されるのでしょうか?
- アプリケーションのスレッドプールを詰まらせることになりませんか?
-
コンパイラは
Delay(0)
が違うか? -
そうだろうか
return Task.Run(() => { });
は、何か違うのでしょうか?
もっといい方法はないのでしょうか?
using System.Threading.Tasks;
namespace MyAsyncTest
{
internal interface IFooFace
{
Task WillBeLongRunningAsyncInTheMajorityOfImplementations();
}
/// <summary>
/// An implementation, that unlike most cases, will not have a long-running
/// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations'
/// </summary>
internal class LazyBar : IFooFace
{
#region IFooFace Members
public Task WillBeLongRunningAsyncInTheMajorityOfImplementations()
{
// First, do something really quick
var x = 1;
// Can't return 'null' here! Does 'Task.Delay(0)' have any performance considerations?
// Is it a real no-op, or if I call this a lot, will it adversely affect the
// underlying thread-pool? Better way?
return Task.Delay(0);
// Any different?
// return Task.Run(() => { });
// If my task returned something, I would do:
// return Task.FromResult<int>(12345);
}
#endregion
}
internal class Program
{
private static void Main(string[] args)
{
Test();
}
private static async void Test()
{
IFooFace foo = FactoryCreate();
await foo.WillBeLongRunningAsyncInTheMajorityOfImplementations();
return;
}
private static IFooFace FactoryCreate()
{
return new LazyBar();
}
}
}
解決方法は?
今日、私がお勧めするのは タスク.CompletedTask を使えば、これを実現することができます。
.net 4.6以前。
使用方法
Task.FromResult(0)
または
Task.FromResult<object>(null)
を作成するよりもオーバーヘッドが少なくなります。
Task
をno-op式で指定します。 を作成する場合
Task
のように、結果があらかじめ決まっている場合は、スケジューリングのオーバーヘッドが発生しません。
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】C#で四捨五入する方法
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] タスクとスレッドの違いは何ですか?
最新
-
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#
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み] 完成したTask<T>を作成する