私は新しいAsyncメソッドに変換したコントローラで動作が遅くなりました。それは今、それが次の文字列を返すために、しかし、任意のjQueryのAjax呼び出し、はるかに高速の代わりに完了するために、非同期のを待っているのMVC 4.5非同期Ajax呼び出しが機能しない
System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult]
を実行します。
私はここで間違っていますか?私は見つけることができるすべての例に従ってきました。これは実装するロケット科学ではありません。ほとんど
も
私は非同期のHTTPを変更しないことを理解し、このビデオ
http://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2287
そして、このリンクに概説されているものを、その後、私は何でしたバックグラウンドで動作するAjaxコールの長時間実行を期待し、終了したときに結果をユーザーに返します。これにより、サーバーを解放して、それらをブロックするのではなく、追加のajax呼び出しを処理します。
アップデート:ここで
はjavascriptのコード
function doWork(options){
return $.ajax("/getData", {
contentType: 'text/json',
async: true,
success: $.proxy(options.callback, options.scope),
error: function (jqXHR, textStatus, error) {
options.callback.apply(options.scope, [error, textStatus, jqXHR]);
}
});
}
であり、ここではC#で、私のコントローラのアクション
[HttpGet]
[AsyncTimeout(60000)]
public async Task<ActionResult> GetData()
{
RestResponse<Data> response = new RestResponse<Data>();
try
{
Data result = null;
await Task.Factory.StartNew(() =>
{
result = ServerImpl.RetrieveData();
});
response.Value = result;
response.HttpStatusCode = 200;
}
catch (Exception ex)
{
response.HttpStatusCode = 500;
response.Value = null;
}
return Json(response, JsonRequestBehavior.AllowGet);
}
コントローラアクションでASP.NETセッションを使用していますか? –
@ダリンはい、そうです。 – Matt
それはあなたの問題です。 ASP.NETセッションでは、同じセッションからの並列要求は実行できません。 ASP.NETセッションはスレッドセーフではないため、ASP.NETは同じセッションからのサーバーへの同時アクセスを単にブロックし、待機して順次実行させます。 ASP.NETセッションでは、アプリケーションに状態や他の多くの問題が導入されています。これはデザインの匂いです。スケーラブルでステートレスなアプリケーションを作成したい場合、最初にすべきことは、それを取り除くことです。 –