这里的异步部分在哪里?

时间:2012-06-11 07:48:38

标签: c# asp.net .net multithreading asynchronous

我看到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

那么这个例子中的异步部分在哪里?

1 个答案:

答案 0 :(得分:2)

当此处理程序收到请求时,它将调用BeginProcessRequest。 它不会阻止调用线程。

处理完成后,会调用EndProcessRequest

这将使您的asp.net工作进程线程在处理时自由地提供其他请求。 调用EndProcessRequest时,您可以将处理后的结果发送回客户端。

以下是关于how asp.net manages threads during an async request生命周期的大量解释。

  

在异步页面的生命周期中,上下文以   只是ASP.NET线程池中的一个线程。异步之后   请求已经开始,上下文不包含任何线程。作为   异步请求完成后,线程池线程执行   他们的完成例程进入上下文。这些可能是相同的   发起请求的线程更可能是什么   在操作完成时,线程碰巧是免费的。

     

如果同一个应用程序同时完成多个操作,   AspNetSynchronizationContext将确保它们在a处执行一个   时间。它们可以在任何线程上执行,但该线程将具有   原始页面的身份和文化。

何时使用异步的一些推理:

  

拥有异步处理程序仅在处理请求时才有用   有其他异步步骤可用(例如一个off-box数据库调用或   一个很长的硬盘驱动器读取,您也可以调用异步。)为此   你会链接异步方法(即BeginProcessRequest会   调用FileStream.BeginRead与相同(或单独)的回调和   处理相应的。)   请参考这里:   http://msdn.microsoft.com/en-us/library/system.web.ihttpasynchandler.aspx

how to use asynchronous handlers

上查看这个非常详细的解释
  

要构建一个真正有效的异步处理程序,您必须生成一个   手动附加线程以响应BeginProcessRequest。那里   构建成功的异步是三个重要方面   处理程序。首先,构造一个支持IAsyncResult返回的类   来自BeginProcessRequest。然后,产生线程来执行你的   请求异步处理。最后,通知ASP.NET你   已完成处理请求并准备返回   响应。

总结一下:如果你没有创建一个处理线程,或者等待很长时间,那么异步处理程序就不会有多大帮助。等待时,请求没有与之关联的线程。这使得asp.net即使在等待时间很长的情况下也可以很好地扩展。

相关问题