【发布时间】:2012-07-16 12:28:29
【问题描述】:
我有一个 asp.net 网络表单,它将大约 25-30 个项目(当用户从表单发出后续请求时需要信息)写入自定义缓存。目前所有这些都在主线程上同步发生。但是在更高的负载下,addcache 正在成为一个瓶颈。
如何在后台运行此任务而不消耗 asp.net 工作进程线程池中的线程。
【问题讨论】:
标签: asp.net backgroundworker threadpool
我有一个 asp.net 网络表单,它将大约 25-30 个项目(当用户从表单发出后续请求时需要信息)写入自定义缓存。目前所有这些都在主线程上同步发生。但是在更高的负载下,addcache 正在成为一个瓶颈。
如何在后台运行此任务而不消耗 asp.net 工作进程线程池中的线程。
【问题讨论】:
标签: asp.net backgroundworker threadpool
替代方案:
从客户端使用AJAX调用服务端代码,并添加代码监控调用过程
我刚刚添加了一个与此过程相关的答案:
从客户端到服务器的调用将是同步的,这意味着在整个过程结束之前不会将响应返回给客户端,但真正的代码将异步执行,释放 ASP.Net 使用的线程,从而提高可伸缩性
异步执行页面。您需要在后面的 ASPX 代码中实现 IHttpAsyncHandler 接口。这是一个例子:
public partial class _Default : System.Web.UI.Page, IHttpAsyncHandler
{
public void EndProcessRequest(IAsyncResult result)
{
var context = (result as AsyncOperation).Context;
context.Response.Write(string.Format("<p>End Process Request on {0}</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
}
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
var operation = new AsyncOperation(cb, this.Context, extraData);
operation.StartAsync();
this.Context.Response.Write(string.Format("<p>Begin Process Request on: {0}...</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
return operation;
}
}
public class AsyncOperation : IAsyncResult
{
private AsyncCallback asyncCallback;
public AsyncOperation(AsyncCallback asyncCallback, HttpContext context, object state)
{
this.AsyncState = state;
this.asyncCallback = asyncCallback;
this.Context = context;
this.IsCompleted = false;
this.AsyncWaitHandle = null;
this.CompletedSynchronously = false;
}
public HttpContext Context { get; private set; }
public object AsyncState { get; private set; }
public WaitHandle AsyncWaitHandle { get; private set; }
public bool CompletedSynchronously { get; private set; }
public bool IsCompleted { get; private set; }
public void StartAsync()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncOperation), this.AsyncState);
}
public void StartAsyncOperation(object workItemState)
{
// place here the async logic
this.Context.Response.Write(string.Format("<p>Long Async operation started on: {0}</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
Thread.Sleep(2000);
this.Context.Response.Write(string.Format("<p>Long Async operation ended on: {0}</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
this.IsCompleted = true;
this.asyncCallback(this);
}
}
输出
创建一个 HttpAsyncHandler。您需要创建一个自定义的HttpHandler 实现IHttpAsyncHandler 接口。示例:
public class AsyncHandler : IHttpAsyncHandler
{
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
var operation = new AsyncOperation(cb, context, extraData);
operation.StartAsync();
context.Response.Write(string.Format("<p>Begin Process Request on: {0}...</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
return operation;
}
public void EndProcessRequest(IAsyncResult result)
{
var context = (result as AsyncOperation).Context;
context.Response.Write(string.Format("<p>End Process Request on {0}</p>", Thread.CurrentThread.ManagedThreadId.ToString()));
}
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
throw new NotImplementedException();
}
}
【讨论】: