Asynchronous 异步SQLCommand与CCR

Asynchronous 异步SQLCommand与CCR,asynchronous,sqlcommand,ccr,Asynchronous,Sqlcommand,Ccr,我一直在玩这篇msdn文章中的演示代码 我在他的ApmToCcrAdapters中添加了一个新函数来处理SqlCommand.BeginExecuteReader。只是它在我读之前就把阅读器关了 以下代码用于提供FromIteratorHandler: private static IEnumerator<ITask> AsyncReaderDemoHandler() { SqlDataReader reader = null; SqlCo

我一直在玩这篇msdn文章中的演示代码

我在他的ApmToCcrAdapters中添加了一个新函数来处理SqlCommand.BeginExecuteReader。只是它在我读之前就把阅读器关了

以下代码用于提供FromIteratorHandler:

    private static IEnumerator<ITask> AsyncReaderDemoHandler()
    {
       SqlDataReader reader = null;
       SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=BizData;Integrated Security=True;Async=True;");
       string query = "SELECT * FROM Account;";
       SqlCommand command = new SqlCommand(query,connection);

       connection.Open();
       yield return Arbiter.Choice(ApmToCcrAdapters.GetReader(command),
          delegate(SqlDataReader r) { Msg("Got SQL data"); reader = r; },
          delegate(Exception e) { Msg("Failed to get SQL data"); });

       connection.Close();

       if (reader == null) yield break;

       //This is where the code fails: Reader is Closed!
       while (reader.Read())
       {
           Console.WriteLine(reader["Account"]);
       }
   }
私有静态IEnumerator AsyncReaderDemoHandler()
{
SqlDataReader=null;
SqlConnection=newsqlconnection(@“数据源=。\SQLEXPRESS;初始目录=BizData;集成安全性=True;异步=True;”);
string query=“从科目中选择*”;
SqlCommand=newsqlcommand(查询、连接);
connection.Open();
收益率返回仲裁者.Choice(ApmToCcrAdapters.GetReader(命令),
委托(SqlDataReader r){Msg(“获取SQL数据”);reader=r;},
委托(异常e){Msg(“获取SQL数据失败”);});
connection.Close();
如果(读卡器==null)产生中断;
//这就是代码失败的地方:读卡器关闭!
while(reader.Read())
{
Console.WriteLine(读卡器[“帐户]);
}
}
然后调用以下代码:

   /// <summary>
   /// Gets the Reader, requires connection to be managed
   /// </summary>
   public static PortSet<SqlDataReader, Exception> GetReader(SqlCommand sqlCommand)
   {
       Port<SqlDataReader> portResponse = null;
       Port<Exception> portException = null;
       GetReaderResponse(sqlCommand, ref portResponse, ref portException);
       return new PortSet<SqlDataReader, Exception>(portResponse, portException);
   }

   // Wrapper for SqlCommand's GetResponse
   public static void GetReaderResponse(SqlCommand sqlCom,
      ref Port<SqlDataReader> portResponse, ref Port<Exception> portException)
   {
       EnsurePortsExist(ref portResponse, ref portException);
       sqlCom.BeginExecuteReader(ApmResultToCcrResultFactory.Create(
          portResponse, portException,
          delegate(IAsyncResult ar) { return sqlCom.EndExecuteReader(ar); }), null);
   }
//
///获取读取器,需要管理连接
/// 
公共静态端口集GetReader(SqlCommand SqlCommand)
{
端口响应=null;
端口portException=null;
GetReaderResponse(sqlCommand、ref-portResponse、ref-portException);
返回新的端口集(portResponse、portException);
}
//SqlCommand的GetResponse的包装器
公共静态无效GetReaderResponse(SqlCommand sqlCom,
参考端口端口响应,参考端口端口异常)
{
确保报告性别歧视(ref-portResponse,ref-portException);
sqlCom.BeginExecuteReader(ApmResultToCcrResultFactory.Create(
portResponse,portException,
委托(IAsyncResult ar){return sqlCom.EndExecuteReader(ar);},null);
}

连接必须保持打开状态,读卡器才能工作。我相信关闭连接是你的问题。保持连接打开,完成后在读卡器上调用dispose,我认为这应该会清理连接