我正在使用ASP.NET 4.5尝试使用新的异步/等待工具。我有一个实现IDataReader接口的类,它封装了一个供应商特定的读取器(例如SqlDataReader)。我有一个简单的ExecuteSql()方法,它像以下同步操作:
public IDataReader ReaderForSql(string sql)
{
var cmd = NewCommand(sql, CommandType.Text);
return DBReader.ReaderFactory(cmd.ExecuteReader());
}
我想要的是这个的异步版本。这是我的第一次尝试:
public Task<IDataReader> ReaderForSqlAsync(string sql, CancellationToken ct)
{
var cmd = NewCommand(sql, CommandType.Text);
return cmd.ExecuteReaderAsync(ct)
.ContinueWith(t => DBReader.ReaderFactory(t.Result));
}
我使用它:
using (var r = await connection.ReaderForSqlAsync("SELECT ...", cancellationToken))
{
...
}
到目前为止,在我的有限测试中表现得非常好。但是在观看了这个Cloud9视频几次之后: http://channel9.msdn.com/Events/aspConf/aspConf/Async-in-ASP-NET,我开始担心他们提到的警告:
- ContinueWith将消耗额外的线程池资源 - Readerfactory非常轻量级!
- Task.Result会造成阻塞
而且由于我正在向ExecuteReaderAsync()传递一个ContinuationToken,所以似乎取消操作只是ExecuteReaderAsync()可能失败的另一个原因(毕竟它是SQL!)
当我尝试继续对其进行操作时,任务的状态将是什么?t.Result会阻塞吗?抛出异常?做错误的事情吗?