【问题标题】:background worker(threadpool) in asp.netasp.net 中的后台工作者(线程池)
【发布时间】:2012-07-16 12:28:29
【问题描述】:

我有一个 asp.net 网络表单,它将大约 25-30 个项目(当用户从​​表单发出后续请求时需要信息)写入自定义缓存。目前所有这些都在主线程上同步发生。但是在更高的负载下,addcache 正在成为一个瓶颈。

如何在后台运行此任务而不消耗 asp.net 工作进程线程池中的线程。

【问题讨论】:

    标签: asp.net backgroundworker threadpool


    【解决方案1】:

    替代方案:

    完全异步:

    部分异步:

    从客户端到服务器的调用将是同步的,这意味着在整个过程结束之前不会将响应返回给客户端,但真正的代码将异步执行,释放 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();
          }
      }
      

    【讨论】:

    • 感谢您的详尽回答,我的问题与异步处理无关。我面临的问题是缓存添加成为更高负载的瓶颈。有什么方法可以将响应返回给客户端,然后启动我的后台进程
    • 也许你应该重新表述你的问题,因为你问过:我怎样才能在后台运行这个任务而不消耗asp.net工作进程线程池中的线程。
    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多