2012-06-11 9 views
1

Я видел this aricle, в котором описывается реализация IHttpAsyncHandler.Где находится асинхронная часть?

Глядя на эту часть:

public class MyAsyncHandler : IHttpAsyncHandler 
{ 
    /// 
    /// The queue holds a list of asynchronous results 
    /// with information about registered sessions 
    /// 
    public static List<myasyncresult> Queue; 


    static MyAsyncHandler() 
    { 
     // Initialize the queue 
     Queue = new List<myasyncresult>(); 
    } 



    public IAsyncResult BeginProcessRequest(HttpContext context, 
         AsyncCallback cb, object extraData) 
    { 
     // Fetch the session id from the request 
     var sessionId = context.Request["sessionId"]; 

     // Check if the session is already registered 
     if (Queue.Find(q => q.SessionId == sessionId) != null) 
     { 
      var index = Queue.IndexOf(Queue.Find(q => q.SessionId == sessionId)); 

      // The session has already been registered, 
      // just refresh the HttpContext and the AsyncCallback 
      Queue[index].Context = context; 
      Queue[index].Callback = cb; 

      return Queue[index]; 
     } 

     // Create a new AsyncResult that holds the information about the session 
     var asyncResult = new MyAsyncResult(context, cb, sessionId); 

     // This session has not been registered yet, add it to the queue 
     Queue.Add(asyncResult); 

     return asyncResult; 
    } 

    public void EndProcessRequest(IAsyncResult result) 
    { 
     var rslt = (MyAsyncResult) result; 

     // send the message to the recipient using 
     // the recipients HttpContext.Response object 
     rslt.Context.Response.Write(rslt.Message); 

     // reset the message object 
     rslt.Message = string.Empty; 
    } 


} 

Где асинхронным часть здесь? Я не вижу здесь BeginXXX.

Также я проверил с Thread.CurrentThread.IsThreadPoolThread на первой линии BeginProcessRequest, и он показал мне TRUE.

Итак, где асинхронная часть здесь в этом примере?

ответ

2

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

Когда обработка завершена, она позвонит EndProcessRequest.

Это приведет к тому, что потоки рабочего процесса asp.net будут свободны для обслуживания других запросов во время обработки. Когда вызывается EndProcessRequest, вы можете отправить обработанный результат обратно клиенту.

Приведено много объяснений о how asp.net manages threads during an async request жизненного цикла.

В течение жизни асинхронной страницы контекст начинается с только одного потока из пула потоков ASP.NET. После запуска асинхронных запросов контекст не содержит потоков. По завершении асинхронных запросов потоки пула потоков, выполняющие , выполняют их процедуры завершения. Это могут быть те же самые потоки , которые инициировали запросы, но, скорее всего, это было бы так, как бы потоки были свободны во время выполнения операций.

Если несколько операций завершены сразу для одного и того же приложения, AspNetSynchronizationContext гарантирует, что они будут выполнять одно из них на этапе . Они могут выполняться в любом потоке, но этот поток будет иметь идентификатор и культуру исходной страницы .

Некоторых рассуждения о том, когда использовать асинхра:

Имея обработчик асинхронного только полезно, если обработать запрос вы других асинхронные шаги, доступные (например, вызов от ящика базы данных или длинный жесткий диск читал, что вы также можете вызывать асинхронный.) Для этого правильно вы бы связали методы async (т.е. BeginProcessRequest вызовет FileStream.BeginRead с тем же (или отдельным) обратным вызовом и соответственно.) См здесь: http://msdn.microsoft.com/en-us/library/system.web.ihttpasynchandler.aspx

Взгляните на этом очень подробно объяснений на how to use asynchronous handlers

Чтобы создать действительно эффективный асинхронный обработчик, вы должны появляться в дополнительный поток вручную в ответ на BeginProcessRequest , Там - три важных аспекта построения успешного асинхронного обработчика . Сначала создайте класс, который поддерживает IAsyncResult, чтобы вернуть из BeginProcessRequest. Затем создайте поток, чтобы выполнить обработку запроса асинхронно. Наконец, сообщите ASP.NET, что вы завершили обработку запроса и готовы вернуть ответ .

Подводя итог: если вы не создаете поток обработки или не ожидаете долгого времени, обработчик async не принесет много пользы. При ожидании запрос не имеет связанных с ним потоков. Это позволяет asp.net хорошо масштабироваться даже при длительных ожиданиях.

+0

так почему я вижу isThreadPool == true? –

+0

из ссылки ", а затем сразу же вернуться из метода BeginProcessRequest" ..... return when? в начале или в конце этой функции? –

+0

Это точно, потому что я не называю какой-либо метод XXX здесь. так где же часть ASYNC? –

Смежные вопросы