MVC3、Razor、C# 4、jQuery を使用して Web アプリケーションを開発しています。
1 つの画面 (ページ) 内で、コントローラー アクションへの AJAX 呼び出しを実行して、画面の更新を取得します。Javascripts setTimeout() を使用して、ポーリングを行います。
サーバーに画面の更新がない場合にこのポーリングを最適化するには、HTTP 応答を遅らせて、a) 画面の更新を取得するか、b) タイムアウト (たとえば 10 秒程度) に達するまで少し待ちます。
私はこのようなことをしようとしました
[OutputCache(Duration = 0)]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult CheckForUpdates()
{
var startTime = DateTime.Now;
while (_haveUpdates || DateTime.Now > startTime.AddSeconds(10 ))
{
Thread.Sleep(3);
}
return _haveUpdate ? Json(new {updates = ... }, JsonRequestBehavior.AllowGet) : null;
}
ビューでは、次のように Javascript / jQuery を使用します。
<script>
$(function () {
scheduleNextCheck();
});
function scheduleNextCheck() {
setTimeout(function() {
$.ajax({
url: "@Url.Action("CheckForUpdates")",
dataType: 'json',
data: null,
timeout: 10000,
cache: false,
success: function(data) {
if (data != null && data.updates != null ) {
// Apply Updates
} else {
scheduleNextCheck();
}
},
error: function() {
scheduleNextCheck();
}
});
}, 2000);
}
このコードを使用すると、IIS7 ワーカー プロセスが完全にハング/フリーズするため、ワーカー プロセスを強制終了するだけで IIS7 サーバー全体のロックを解除できます。したがって、 Thread.Sleep() は良い考えではないようです。少なくとも私のアプリケーション環境ではありません。
誰かが ASP.Net MVC でこのようなタイム処理を行ったことがありますか?
Thx、マーク
==== 更新: ====
問題の 1 つが見つかりました: while 基準が間違っていました。次のようになります。
while (noUdates && DateTime.Now < startTime.AddSeconds(10))
現在の問題は、このスリープ遅延ループの実行中に他の AJAX リクエストがキャンセルされることです。
SignalR について:詳細を確認する必要がありますが、問題は、これには追加のサーバー側およびクライアント側のライブラリが必要であり、承認を得る必要があることです。そのため、影響が少なく、トレーニングの必要性が少ない「簡単な」小さなソリューションを望んでいました。 . ただし、SignalR は、次のリリースのいずれかでポーリング関連の機能を置き換えるオプションとして引き続き使用できますが、最初にこの機能に関するトレーニングと経験を積む必要があります。
==== アップデート 2: ====
ライブラリやフレームワークを追加せずに機能するソリューションを探しているので、ほぼ完成した Web アプリケーションに大きな影響を与えずに適用できます。