这里的异步部分在哪里
本文关键字:在哪里 异步部 这里 | 更新日期: 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 即使在长时间等待任务的情况下也能很好地扩展。