2016-05-18 10 views
1

情報を持つJSON文字列のみを返すアクションがあります。ASP.NETでTask.Delayを使用するのは安全ですか?

ユーザーが2秒ごとに情報を更新するJSコードを編集しないようにするため、CPU負荷が高くなるのを防ぐためにサーバー側の遅延も必要です。

同じリクエストを同時に実行している(たとえば)2000〜5000人のユーザーがいる場合、Task.Delay(2000)を使用するとどのくらい安全でしょうか?返される情報はユーザーごとに異なります。

+0

私は全くありません何を達成したいのか理解していますが、何らかのキューを使用してタイマーで操作を実行しないのはなぜですか? –

+0

@ ConstantinPeshekhonov IISは既にキューを使用しており、結果の抑制*および*キャッシュをサポートしています。それらを再発明する必要はありません –

+0

@AlekPskあなたが言うものは、要求の多い負荷ではありません。 HTTP、IIS、ASP.NETにはすべて、キャッシュ応答を処理する方法があります。個々のユーザーの応答に出力キャッシュを使用することができます(たとえば、2秒のタイムアウト)。適切な場合には、IIS自体がキャッシュされた応答を返すように適切なヘッダーを指定できます(たとえば、ETag、Expires)。 'If​​-Modified-Since'ヘッダまたは' If-None-Match'と最後のETagを持つバージョンの更新だけを要求するようにクライアントを変更することができます –

答えて

2

Task.Delayは、スレッドの作成やブロックを含まないため、CPUをストールさせることがないため、使用するのが完全に安全です。

一方、1台のマシンから複数のリクエストを実行することはまだ可能ですから、それはあなたを助けません。それ以上のチェックをしなくても実行を遅らせることは、リクエストを絞り込むための無駄な方法です。

1

Task.Delayの場合、これは問題ありません。 Task.Delayは、タスクが完了した時点で(タイマーのコールバックで)そのタスクを続行するタイマーを持つタスクになります。それが動作する方法を考えると、それはあなたのスレッドをブロックせず、別のスレッドで実行されないので、うまくいくようです。あなたが投稿したリクエストの数も、それほど大きくはありません。

しかし、私の答えはASP.NET MVCで特定のシナリオよりもTask.Delayを使用していることですが、より具体的な答えが必要な場合は詳細に記述する必要があります。

2

なぜTask.Delay(2000)を追加するとCPU負荷が軽減されると思いますか? TでのCPU負荷が高い場合は、Task.Delay(2000)を追加するだけでCPU負荷がT + 2に上がりますが、これはまったく無力です。

簡単な解決策は、Webページのように、UI側で送信頻度を確認し、送信ボタンを無効にしてから数秒後にもう一度有効にすることです。しかし、これは、フロントエンドのスクリプトを変更できるので、不正使用される可能性があります。

より安全な解決策は、サーバー側で送信頻度をチェックすることです。最後の送信時刻をどこかに記録します(たとえば、静的変数、最も単純なもの)。無効なリクエストを拒否します。

0

ユーザーがasp.netセッションを使用する場合、asp.netで正しい答えが表示されます。asp.netセッションはサイト全体をロックします。コールが戻ります。あなたは遅延は、セッションで、あなたはすべてのユーザーをブロックすることを使用する場合

だから... ...についてお読みください:

Does ASP.NET Web Forms prevent a double click submission?
Web app blocked while processing another web app on sharing same session
What perfmon counters are useful for identifying ASP.NET bottlenecks?
Replacing ASP.Net's session entirely
Trying to make Web Method Asynchronous

関連する問題