0

API 応答を 1 回の呼び出しで 2 秒に短縮したいと考えています。これは適切な方法だと思いますか (vb.net コード)...


Dim timeToSleep = 2000 - Date.Now.Subtract(start).TotalMilliseconds

「ここで実行するコード...

timeToSleep > 0 の場合 Threading.Thread.Sleep(timeToSleep)


Threading.Thread.Sleep 関数はこの API 要求のみをブロックしますか? Sleep 関数の実行中に他の誰かが API リクエストをヒットした場合はどうなりますか?

これを行うべきより良い方法はありますか?

ありがとう。

4

2 に答える 2

0

これは、自然な遅延をシミュレートするためのテストシナリオ(負荷テスト/ユーザー受け入れテスト)でのみ有用であり、このコードが本番環境に影響を与えることは決してないと考えることができますが、これは機能し、他の呼び出しができる間、呼び出しは遅延します走る。問題は、ブロックしているスレッドです。

通常のオブジェクトまたはを返すHttpResponseMessageと、呼び出しによってASP.NETのスレッドプールがブロックされます。これは、IIS 7では1000だと思います。これ以上要求すると、サーバーは503エラーを返します。

を返す場合はTask<T>、別のスレッドプールを使用するスケジューラーを指定しない限り、.NETのThreadPoolスレッドをブロックしています。このプール内のスレッド数は、の静的メソッドを使用して設定できる最小値と最大値ThreadPoolの間で変動します。

私のブログには、このテーマに関するいくつかの投稿があります。

于 2012-07-12T18:03:18.317 に答える
0

Threading.Thread.Sleep 関数はこの API 要求のみをブロックしますか? Sleep 関数の実行中に他の誰かが API リクエストをヒットした場合はどうなりますか?

スリープを使用して API 呼び出しの相対的な出力時間を調整しようとする場合がありますが、遅延、処理、その他の遅い/速い応答時間の原因などを考慮に入れると、その間隔で確実に調整できないことに注意してください。

これを行うべきより良い方法はありますか?

どちらかといえば、API呼び出しを微調整して、可能な限り高速かつ軽量にし、呼び出し時にクライアント側で間隔を空けることをお勧めします。(なぜあなたがこれをしているのか誤解していない限り。)

また、長いポーリング ソリューションを検討することもできます。

于 2012-07-12T16:43:31.937 に答える