ann*_*ijn 5 .net c# asynchronous .net-4.0 .net-4.5
我正在研究一个在.NET 4.0上运行的大型项目.该框架使用ADO.NET进行数据库调用,我们目前正在添加异步API方法.该SqlCommand班有APM方法SqlCommand.BeginExecuteReader()和SqlCommand.EndExecuteReader(),但SqlDataReader不具有异步实现.
当SqlCommand.ExecuteReader()完成我想通过使用效果进行迭代SqlDataReader.Microsoft SqlDataReader在.NET 4.5中引入了异步方法,因此我不能在4.0中使用它们.
问题:我们应该升级才能使用异步(TAP)方法SqlDataReader吗?如果我们这样做,为什么?
我搜索了网络和stackoverflow很多答案,但我似乎只是找到了这个实现.它没有告诉我这些新实现给出了什么好处.
这里我们使用异步方法SqlCommand,但我们不能使用新的异步方法SqlDataReader,比如SqlDataReader.ReadAsync().
private Task<IDataReader> ExecuteReaderAsync(IDbCommand dbCommand)
{
var sqlCommand = CheckIfSqlCommand(dbCommand);
PrepareExecuteReader(dbCommand);
return Task<IDataReader>
.Factory
.FromAsync(sqlCommand.BeginExecuteReader, sqlCommand.EndExecuteReader, null);
}
private void ReadAll(Task<IDataReader> readerTask)
{
var reader = readerTask.Result;
while (reader.Read()) // Should this be asynchronously?
{
// Do something
}
}
public Task<IDataReader> Foo(IDbCommand dbCommand) {
return ExecuteReaderAsync(dbCommand)
.ContinueWith(readerTask => ReadAll(readerTask));
}
Run Code Online (Sandbox Code Playgroud)
在.NET 4.5中我们可以使用async/await关键字,我们可以使用新的异步方法SqlDataReader,比如SqlDataReader.ReadAsync().
private async Task<SqlDataReader> ExecuteReaderAsync(SqlCommand dbCommand)
{
PrepareExecuteReader(dbCommand);
return await dbCommand.ExecuteReaderAsync();
}
private async Task ReadAll(SqlDataReader reader)
{
while (await reader.ReadAsync()) // Should this be asynchronously?
{
// Do something
}
}
public async Task<IDataReader> Foo(SqlCommand dbCommand)
{
var reader = await ExecuteReaderAsync(dbCommand);
await ReadAll(reader);
return reader;
}
Run Code Online (Sandbox Code Playgroud)
理论上的好处是您的应用程序将使用更少的线程,因此在线程开销上消耗更少的内存和 CPU 资源。这反过来又为您的应用程序或其他系统活动留下更多可用资源,从而提高应用程序的性能和可扩展性。
对于同时接收大量请求的应用程序来说,好处可能是巨大的。不过,您只能通过测试特定应用程序来发现实际差异。 这是一篇很好的文章,深入探讨了细节。
我的观点是,如果您没有发现异步 DataReader 代码更难理解、阅读和调试,那么就继续使用它。它将与您处理命令代码的方式一致,并且异步通常被认为是现代最佳实践。你会失去什么?
不过,我确实想提一下,您确实应该考虑使用更高级别的 API,即 ORM。我认为 Entity Framework 和 nHibernate 是目前.NET 中最流行的。EF6 具有内置的异步支持,对于典型的异步查询,您可以简单地使用 ToListAsync() 之类的方法。首先请参阅此内容。
| 归档时间: |
|
| 查看次数: |
2513 次 |
| 最近记录: |