我看到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
。
那么这个例子中的异步部分在哪里?
答案 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即使在等待时间很长的情况下也可以很好地扩展。