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