2017-01-08 9 views
1

В приведенном ниже коде есть HttpTaskAsyncHandler, который вызывает doit, который сначала задерживает 5 секунд и записывает строку в браузер.HttpTaskAsyncHandler - кажется, блокируется, но я знаю, что что-то не так

Если у меня есть две вкладки браузера, открывайте их и вызывайте эту страницу на обоих. Первый отвечает за 5 секунд, а второй в 10.

Почему второй запрос ожидает завершения первого? Задержка заключалась только в том, чтобы представить время, затраченное на выполнение работы.

public class MyHandler : HttpTaskAsyncHandler 
{ 
    public override bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 

    public override Task ProcessRequestAsync(HttpContext p_ctx) 
    { 
     return doit(p_ctx); 
    } 

    static int _count = 0; 
    async Task doit(HttpContext p_ctx) 
    { 
     await Task.Delay(5000); 
     p_ctx.Response.Write("doit " + (++_count).ToString()); 
    } 

} 

ответ

0

Async не означает одновременный. Когда вы определяете обработчик Async, это по существу означает, что вы возвращаете поток в пул потоков, когда это вызов awaiting.

Что происходит в вашем случае, так это то, что IIS Express отправляет запросы. Он делает это потому, что он нуждается в эксклюзивную блокировку на сессии:

Экстракт из http://msdn.microsoft.com/en-us/library/ms178581.aspx

Параллельных запросов и состояния сеанса

Доступ к ASP.NET состояние сеанса исключительно на сессии, что означает, что если два разных пользователя выполняют параллельные запросы, доступ к каждому отдельному сеансу предоставляется одновременно. Однако, если два одновременных запроса сделаны для одного и того же сеанса (с использованием того же значения SessionID), первый запрос получает эксклюзивный доступ к информации о сеансе. Второй запрос выполняется только после завершения первого запроса. (Второй сеанс также может получить доступ, если исключительная блокировка информации освобождается, потому что первый запрос превышает тайм-аут блокировки.) Если значение EnableSessionState в директиве @ страницы установлено в ReadOnly, запрос для чтения только для чтения информация сеанса не приводит к исключительной блокировке данных сеанса. Тем не менее, запросы только для чтения для данных сеанса могут по-прежнему ждать блокировки, установленной с помощью запроса на чтение и запись для очистки данных сеанса.

Возможные варианты:

  • Выполнить второй запрос в другом браузере (или в режиме инкогнито)
  • Отключить SessionState
+0

Спасибо. Я даже не подумал об этом. Я должен был протестировать его в отдельном браузере, как вы упомянули, или в Incognito. Это действительно было проблемой. – gkelly

+0

Рад помочь! Если ответ помог вам, пожалуйста, поддержите/принять ответ. – Kenneth

+0

любил бы повышать, но я новый пользователь. видимо, мое мнение еще не подсчитано. – gkelly