异步执行的返回值...

.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");
    }
    }
  

}


自己的一点想法,不一定很好,也许还有更好的方法。
posted @ 2006-05-31 07:44  upzone  阅读(1043)  评论(4编辑  收藏  举报