2016-12-17 12 views
1

私は 'アクション'で非同期を使用しますが、同時に3つのタブでページにアクセスすると常に同期します。なぜ非同期アクション(async await)でasp.net mvcを常に同期するのですか?

私は、次のタブページの 'startTime'が前のタブ 'endTime'であることを確認します。これは非同期ではありません。

ありがとうございます。

public class TestController : Controller 
{ 
    public async Task<string> Index() 
    { 
     return await Task.Run(() => 
     { 
      List<string> lst = new List<string>(); 
      lst.Add(string.Format("startTime:{0}", DateTime.Now.ToString())); 
      var s = new Stopwatch(); 
      s.Start(); 
      System.Threading.Thread.Sleep(10000); 
      s.Stop(); 
      lst.Add(string.Format("endTime:{0}", DateTime.Now.ToString())); 
      lst.Add(string.Format("total:{0}", s.Elapsed.TotalSeconds.ToString())); 
      return string.Join("<br/>", lst.ToArray()); 
     }); 
    } 
} 

enter image description here

+1

あなたは、非同期コントローラメソッドが何であるか誤解しているかもしれません。これは、長時間実行されているタスクでは、スレッドがスレッドプールに返され、より多くの要求を処理できることを意味します(メソッドの実行に要する時間は短縮されません)。 [ASP.NETの非同期メソッド](https://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4) –

+0

ですが、UIは常に待機しています。以前の要求が完了するまで。 –

+0

これは、メソッドを非同期にすることとは関係ありません。 –

答えて

0

実際には非同期/とは何の関係が待っていないと、あなたは、並列要求の実行でそれを混乱されています。

私の推測では、これはセッションロックのために発生すると考えられます。 デフォルトでは、ASP.NET MVCハンドラは、1つのセッションにつき1つの要求をその時点で処理します。その理由は、MVCハンドラーは、各要求セッションで変更可能であり、すべての順次要求を最新のセッション値で処理する必要があると想定しているからです。

[SessionState(SessionStateBehavior.ReadOnly)] 
public class TestController : Controller 
{ 
    public async Task<string> Index() 
    { 
     return await Task.Run(() => 
     { 
      ... 
     }); 
    } 
} 

この属性を適用することにより、あなたがセッションのロックを無効にして、複数のリクエストが同じセッションオブジェクト上で並列に実行することを可能にする:あなたは簡単にあなたのコントローラ上の正しいSessionStateBehavior.ReadOnlyまたはSessionStateBehavior.Disabledを設定することによって、この動作を変更することができます。

+0

私はそれを試して、それはまだです。今はvsによって作成された新しいmvcプロジェクトです。 –

関連する問題