2017-04-09 12 views
0

私は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

私は何ができるのを試してみましたか?

+0

は「ブロック」されます - あなたはを終えたときにのみ応答が送信されます長い実行プロセス。 ASP.NETで 'async-await'は、待ち状態の間だけ現在のスレッドを解放し、タスクが完了すると実行を続行します。クライアント側の観点からは、要求 - 応答は同期的です。クライアント側では、非同期で呼び出しを行うajaxを使用できます。 – Fabio

+0

@Fabio長時間実行されているプロセスで他のリクエストに対するアプリケーションの応答が必要な理由は、最初にasync/awaitを使用した理由です。 –

+2

ASP.NET Web API 2は、 'async/await'がなくても他のリクエストに対しても応答します – Fabio

答えて

0

長時間実行されているメソッドが動的に呼び出されているように見え、asyncメソッドの結果を待っているスレッドがスレッドプールに戻ります。

Task.Factory.StartNewを使用しているため、新しいスレッドで作業を開始し、スレッドをブロックしている作業を同期して実行しています(これはGetParsedApplicationsAsyncから直接ブロックコードを呼び出すよりも少し悪いです)。あなたの応答は、この長い実行中のメソッドの結果を必要とする場合

一番下の行は、あなたがそれを動的に呼び出すときに、Task<T>await結果に結果をキャストし、この方法asyncにする必要があります。

決勝先端あなたの最後の行が読まなければならないので、あなただけではなく、await Task.FromResult(...)の結果を返すことができます。サーバー側の要求に

return Json(action, JsonRequestBehavior.AllowGet); 
関連する問題