none
=================有关IHttpAsyncHandler======================== RRS feed

  • 问题

  • public class Async : IHttpHandler, IHttpAsyncHandler
    {
        public void ProcessRequest(HttpContext context) { }
    
        public bool IsReusable { get { return false; } }
    
        private SqlConnection m_conn;
        private SqlCommand m_cmd;
        private HttpContext m_context;
    
        public IAsyncResult BeginProcessRequest(
            HttpContext context, AsyncCallback cb, object extraData)
        {
            this.m_context = context;
            this.m_conn = new SqlConnection("sqlconn");
            this.m_cmd = new SqlCommand("insert into ......", this.m_conn);
            this.m_conn.Open();
    
            return this.m_cmd.BeginExecuteNonQuery(cb, extraData);
        }
    
        public void EndProcessRequest(IAsyncResult result)
        {
            this.m_cmd.EndExecuteNonQuery(result);
            this.m_conn.Dispose();
    
            this.m_context.Response.ContentType = "text/plain";
            this.m_context.Response.Write("Hello World");
        }
    }

    请问,在执行

    this.m_cmd.BeginExecuteNonQuery
    这个方法以前,我从context中查询Request.Form发现一个指字的键的值是空字符串,则没有必要执行
    this.m_cmd.BeginExecuteNonQuery
    这句,请问现在该如何做?

    2012年5月29日 8:44

答案

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.SqlClient;
    
    namespace AsyncHandler
    {
        /// <summary>
        /// Async 的摘要说明
        /// </summary>
        public class Async : IHttpHandler, IHttpAsyncHandler
        {
            public void ProcessRequest(HttpContext context) { }
    
            public bool IsReusable { get { return false; } }
    
            private SqlConnection m_conn;
            private SqlCommand m_cmd;
            private HttpContext m_context;
    
            // 定义一个委托来创造异步操作返回对象
            private System.Action action;
    
            public IAsyncResult BeginProcessRequest(
                HttpContext context, AsyncCallback cb, object extraData)
            {
                
                this.m_context = context;
    
                if (context.Request.QueryString["xx"] != null)
                {
                    this.m_conn = new SqlConnection("server=.\\sqlexpress;database=musicstore;integrated security=true;Asynchronous Processing=true");
                    this.m_cmd = new SqlCommand("select 1", this.m_conn);
                    this.m_conn.Open();
    
                    IAsyncResult result = this.m_cmd.BeginExecuteNonQuery(cb, extraData);
                    
                    return result;  
                }
                else
                {
                    // 创建委托实例
                    this.action = () => { };
                    return action.BeginInvoke(cb, extraData);
                }            
            }
    
            public void EndProcessRequest(IAsyncResult result)
            {
                
                this.m_context.Response.ContentType = "text/plain";
    
                if ( this.action != null)
                {
                    this.action.EndInvoke(result);
    
                    this.m_context.Response.Write("No Data Access!");
                }
                else  if (this.m_cmd != null)
                {
                    this.m_cmd.EndExecuteNonQuery(result);
                    this.m_conn.Dispose();
    
                    this.m_context.Response.Write("Data Access Complete!");
                }
            }
        }
    }

    在你的代码中增加一个委托,通过委托可以创建出异步返回对象。

    然后,在结束异步的时候检查是哪个对象创建的异步返回对象。

    希望能帮到你。


    冠军

    2012年6月1日 14:36

全部回复

  • 没有人会吗????
    2012年5月29日 11:06
  • 尝试这样做:

    public class Async : IHttpHandler, IHttpAsyncHandler
    {
       
    public void ProcessRequest(HttpContext context) { }

       
    public bool IsReusable { get { return false; } }

       
    private SqlConnection m_conn;
       
    private SqlCommand m_cmd;
       
    private HttpContext m_context;

       
    public IAsyncResult BeginProcessRequest(
           
    HttpContext context, AsyncCallback cb, object extraData)
       
    {
            if(context.Request.Form["xx"]!=null)
             {

           
    this.m_context = context;

           
    this.m_conn = new SqlConnection("sqlconn");
           
    this.m_cmd = new SqlCommand("insert into ......", this.m_conn);
           
    this.m_conn.Open();

           
    return this.m_cmd.BeginExecuteNonQuery(cb, extraData);

             }
       
    }

       
    public void EndProcessRequest(IAsyncResult result)
       
    {
           
    this.m_cmd.EndExecuteNonQuery(result);
           
    this.m_conn.Dispose();

           
    this.m_context.Response.ContentType = "text/plain";
           
    this.m_context.Response.Write("Hello World");
       
    }
    }

    如果不行,请直接发邮件到:msdnmg@microsoft.com ,谢谢!

    2012年5月30日 2:50
  • 我没有试您的代码。但从上面来看这样可以通过编译吗?
    2012年5月30日 5:26
  • 我没有试您的代码。但从上面来看这样可以通过编译吗?

    Sorry,还是问问MS吧:-)

    或者尝试在最后加上return null;

    2012年5月30日 5:29
  • 48小时过去了。
    2012年5月31日 0:48
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.SqlClient;
    
    namespace AsyncHandler
    {
        /// <summary>
        /// Async 的摘要说明
        /// </summary>
        public class Async : IHttpHandler, IHttpAsyncHandler
        {
            public void ProcessRequest(HttpContext context) { }
    
            public bool IsReusable { get { return false; } }
    
            private SqlConnection m_conn;
            private SqlCommand m_cmd;
            private HttpContext m_context;
    
            // 定义一个委托来创造异步操作返回对象
            private System.Action action;
    
            public IAsyncResult BeginProcessRequest(
                HttpContext context, AsyncCallback cb, object extraData)
            {
                
                this.m_context = context;
    
                if (context.Request.QueryString["xx"] != null)
                {
                    this.m_conn = new SqlConnection("server=.\\sqlexpress;database=musicstore;integrated security=true;Asynchronous Processing=true");
                    this.m_cmd = new SqlCommand("select 1", this.m_conn);
                    this.m_conn.Open();
    
                    IAsyncResult result = this.m_cmd.BeginExecuteNonQuery(cb, extraData);
                    
                    return result;  
                }
                else
                {
                    // 创建委托实例
                    this.action = () => { };
                    return action.BeginInvoke(cb, extraData);
                }            
            }
    
            public void EndProcessRequest(IAsyncResult result)
            {
                
                this.m_context.Response.ContentType = "text/plain";
    
                if ( this.action != null)
                {
                    this.action.EndInvoke(result);
    
                    this.m_context.Response.Write("No Data Access!");
                }
                else  if (this.m_cmd != null)
                {
                    this.m_cmd.EndExecuteNonQuery(result);
                    this.m_conn.Dispose();
    
                    this.m_context.Response.Write("Data Access Complete!");
                }
            }
        }
    }

    在你的代码中增加一个委托,通过委托可以创建出异步返回对象。

    然后,在结束异步的时候检查是哪个对象创建的异步返回对象。

    希望能帮到你。


    冠军

    2012年6月1日 14:36