私はMvc Web APIを持っています。私は非同期jqueryで長時間実行しているアクション(1分)を呼び出していますが、結果が戻るまですべてのものがブロックされます。asyncタスクブロックのWebリクエスト
これは私のアクション
[System.Web.Http.HttpGet]
public async Task<JsonResult> GetParsedApplicationsAsync(string className, string actionName)
{
var userRoles = Users.Profile.GetCurrentOrNew().Roles.Select(x => x.Id);
var sss = AppDomain.CurrentDomain.GetAssemblies();
var assemblies = sss
.SelectMany(x => x.GetTypes())
.Where(x => typeof(IAppSearch).IsAssignableFrom(x));
var l = new List<decimal?>();
foreach (var userRole in userRoles)
{
l.Add(userRole);
}
var apps =
new VwApplicationsDetailsDap().GetByRoleIds(l.ToArray(), Request.QueryString, "", pagenation: false);
// Long Running method
var action = await Task.Factory.StartNew(() =>
{
// create instance of class
var type = assemblies.FirstOrDefault(x => x.Name == className);
var instance = Activator.CreateInstance(type, apps);
return type.GetMethod(actionName).Invoke(instance, BindingFlags.IgnoreCase, null, null, null);
});
return await Task.FromResult(Json(action, JsonRequestBehavior.AllowGet));
}
であり、私はまた、var action = await Task.Run(() =>
代わりのawait Task.Factory.StartNew
私は何ができるのを試してみましたか?
は「ブロック」されます - あなたはを終えたときにのみ応答が送信されます長い実行プロセス。 ASP.NETで 'async-await'は、待ち状態の間だけ現在のスレッドを解放し、タスクが完了すると実行を続行します。クライアント側の観点からは、要求 - 応答は同期的です。クライアント側では、非同期で呼び出しを行うajaxを使用できます。 – Fabio
@Fabio長時間実行されているプロセスで他のリクエストに対するアプリケーションの応答が必要な理由は、最初にasync/awaitを使用した理由です。 –
ASP.NET Web API 2は、 'async/await'がなくても他のリクエストに対しても応答します – Fabio