【问题标题】:Where is the asynchronous part here?这里的异步部分在哪里?
【发布时间】:2012-06-11 07:48:38
【问题描述】:

我看到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 方法。

我还在BeginProcessRequest 的第一行检查了Thread.CurrentThread.IsThreadPoolThread,它显示了TRUE

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

【问题讨论】:

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


    【解决方案1】:

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

    处理完成后,它将调用EndProcessRequest

    这将使您的 asp.net 工作进程线程可以在处理过程中腾出时间来处理其他请求。 当EndProcessRequest被调用时,您可以将处理后的结果发送回客户端。

    这里有很多关于how asp.net manages threads during an async request生命周期的解释。

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

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

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

    只有在处理您的请求时,使用异步处理程序才有用 有其他可用的异步步骤(例如离线数据库调用或 一个长的硬盘驱动器读取,您也可以调用异步。)要做到这一点 正确地,您将链接异步方法(即 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 可以很好地扩展,即使是等待时间很长的任务。

    【讨论】:

    • 从链接“然后立即从 BeginProcessRequest 方法返回”.....什么时候返回?在这个函数的开头还是结尾?
    • 这正是重点,我没有在这里调用任何 begin XXX 方法。那么 ASYNC 部分在哪里?
    • 正在运行的线程是 ThreadPool 线程有什么问题?你不必调用它。 Asp.net 将为您做到这一点。这就是您实施IHttpAsyncHandler 的原因
    • 是的,我会加入同一个房间
    猜你喜欢
    • 2011-03-04
    • 2011-01-23
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多