这里的异步部分在哪里

本文关键字:在哪里 异步部 这里 | 更新日期: 2023-09-27 18:36:50

我看到了这个描述实现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 方法。

我还在BeginProcessRequest的第一行与Thread.CurrentThread.IsThreadPoolThread进行了检查,它向我展示了TRUE

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

这里的异步部分在哪里

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

处理完成后,它将调用EndProcessRequest

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

下面是有关 asp.net 如何在异步请求生命周期中管理线程的大量说明。

在异步页面的生存期内,上下文以 ASP.NET 线程池中只有一个线程。异步后 请求已启动,上下文不包含任何线程。作为 异步请求完成,线程池线程正在执行 他们的完成例程进入上下文。这些可能是相同的 发起请求的线程,但更有可能是任何线程 在操作完成时,线程恰好是空闲的。

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

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

拥有异步处理程序仅在处理请求时才有用 具有其他可用的异步步骤(例如外部数据库调用或 一个长硬盘驱动器读取,您也可以调用异步。为此 正确地,您将链接异步方法(即开始过程请求将 使用相同(或单独的)回调调用 FileStream.BeginRead,并且 相应地处理。 参考这里: http://msdn.microsoft.com/en-us/library/system.web.ihttpasynchandler.aspx

看看这个关于如何使用异步处理程序的非常详细的解释

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

总结一下:如果您没有创建处理线程,或者等待很长时间,异步处理程序不会有太大好处。等待时,请求没有与之关联的线程。这使得 asp.net 即使在长时间等待任务的情况下也能很好地扩展。