异步执行的返回值...

.net 2.0中引入了异步的数据库执行,比如说原来的ExecuteNonQuery有了对应的BeginExecuteNonQuery,EndExecuteNonQuery,如下:
public   void  ExecuteAsyncNonQuery(SqlConnection conn, CommandType commandType,  string  commandText,  params  SqlParameter[] param)
{            
    SqlCommand cmd 
=   new  SqlCommand();
    
// SqlTransaction trans=this.Conn.BeginTransaction();
     try
    {
    PrepareCommand(cmd, conn, (SqlTransaction)
null , commandType, commandText, param);
    AsyncCallback callback 
=   new  AsyncCallback(HandleCallback);
    cmd.BeginExecuteNonQuery(callback, cmd);
    

    }
    
catch  (Exception ex)
    {                
    OnError(ex.Message);
    
throw  ex;
    }
    
// finally
    
// {
    
//     cmd = null;
    
// }

    
}
private   void  HandleCallback(IAsyncResult ar)
{
    SqlCommand cmd;
    
try
    {
    cmd
=  (SqlCommand)ar.AsyncState;
    
int  rowCount  =  cmd.EndExecuteNonQuery(ar);
    OnRowAffect(rowCount);

    }
    
catch
    {
    }
    
finally
    {
    cmd 
=   null ;
    }
}

比如说原来我想通过ExecuteNonQuery得到返回值,检查执行多少行,
(备注:今天看了篇文章,如果ExecuteNonQuery执行中有触发器执行,那么返回的affected rows为executenonquery和触发器执行的总和,具体没有验证过)
那么现在直接执行ExecuteAsyncNonQuery是拿不到返回值的,怎么办呢,我这里想到的一般是CallBack的时候得到执行EndExecuteNonQuery后触发事件,将返回值以事件的方式抛出。如上文中的OnRowAffect,调用端订阅这个事件。

如这里的Socket调用,也是同样方法:

// TODO:Socket关闭nagle算法
// 微软nagle算法。为了有效利用带宽,nagle算法会使得Socket发送短数据包尽量合并发送,就产生一个延迟。

socketSB.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, 
1 );
AsyncCallback async
= new  AsyncCallback(CallBack);
socketSB.BeginSend(bts, 
0 , bts.Length, SocketFlags.None,  out  errorcode, async, socketSB);
return ;


private   void  CallBack(IAsyncResult ar)
{
    
if  (ar.AsyncWaitHandle.WaitOne())
    {
    
//  Retrieve the socket from the state object.
    Socket socketSB  =  (Socket)ar.AsyncState;

    
//  Complete sending the data to the remote device.
     int  bytesSent  =  socketSB.EndSend(ar);
    
if  (bytesSent  ==   0 )
    {
        OnSocketSendError(
" Send failed " );
    }
    
else
    {
        
        OnSocketSendError(
" Success " );
    }
    }
  

}


自己的一点想法,不一定很好,也许还有更好的方法。

转载于:https://www.cnblogs.com/upzone/archive/2006/05/31/413583.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值