現在、同時ユーザーに苦労しているWebサイトがあります。
プロジェクトの非常に高レベルな背景は次のとおりです。
- 従来の ASP.NET MVC 3 プロジェクト (.NET 4)
- コアコードの大幅な書き直しはできません
- 実行に最も時間がかかる主なエントリ ポイントは、コントローラーの
SubmitSearch
アクションです。Search
応答までの平均時間は 5 ~ 10 秒です。
したがって、2 番目のポイントで概説するように、このプロジェクトで大きなセクションを書き直すことにあまり時間をかけたくありません。ただし、同時接続ユーザーを増やしたいと考えています。より多くの作業が必要になるため、他の変更やパフォーマンスの向上は考えていません。
私たちが見ているのは、より多くの人がSubmitSearch
にアクセスするにつれて、一般的に Web サイトの速度が低下するということです。これは、すべての IIS スレッドが検索の実行中にロックされていることが原因である可能性が最も高いです。
通常の CLR スレッドでアクションを実装AsyncController
して実行することを検討しています。SubmitSearch
実装方法は次のとおりです。
SubmitSearch
これが元の方法であると仮定します。
/// <summary>
/// Submits a search for execution.
/// </summary>
/// <param name="searchData">The search data</param>
/// <returns></returns>
public virtual ActionResult SubmitSearch(SearchFormModel searchData)
{
//our search code
}
変換したいと思っていた最も簡単な方法AsyncController
は、単純に次のようにすることです。
/// <summary>
/// Submits a search for execution.
/// </summary>
/// <param name="searchData">The search data</param>
/// <returns></returns>
protected virtual ActionResult SubmitSearch(SearchFormModel searchData)
{
//our search code
}
/// <summary>
/// Asynchronous Search entry point
/// </summary>
/// <param name="searchData"></param>
public void SubmitSearchAsync(SearchFormModel searchData)
{
AsyncManager.OutstandingOperations.Increment();
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
ActionResult result = SubmitSearch(searchData);
AsyncManager.Parameters["result"] = result;
AsyncManager.OutstandingOperations.Decrement();
});
return;
}
/// <summary>
/// Called when the asynchronous search has completed
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
public ActionResult SubmitSearchCompleted(ActionResult result)
{
//Just return the action result
return result;
}
もちろん、これは機能しませんでした。これは、コード全体で を参照HttpContext.Current
しているnull
ためです。
そのため、次の方法でこれを行うことを望んでいましたSubmitSearchAsync
。
/// <summary>
/// Asynchronous Search entry point
/// </summary>
/// <param name="searchData"></param>
public void SubmitSearchAsync(SearchFormModel searchData)
{
AsyncManager.OutstandingOperations.Increment();
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
ActionResult result = null;
AsyncManager.Sync(() =>
{
result = SubmitSearch(searchData);
});
AsyncManager.Parameters["result"] = result;
AsyncManager.OutstandingOperations.Decrement();
});
return;
}
これにより、問題が修正されます。
だからここに私の懸念があります:メソッド
の実行をラップすると、SubmitSearch
このAsyncManager.Sync
モデルを使用する目的が無効になりますか? つまり、AsyncManager.Sync
メソッド内にいるときは、IIS スレッドに戻るので、振り出しに戻るのでしょうか?
ありがとう