使用 ASP.NET 4.5,我正在尝试使用新的 async/await 玩具。我有一个 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 很轻!
- 任务.结果阻塞
并且由于我将 ContinuationToken 传递给 ExecuteReaderAsync() 似乎取消只是 ExecuteReaderAsync() 可能失败的另一个原因(毕竟是 SQL!)
当我尝试 ContinueWith 时,任务的状态是什么?t.Result 会阻塞吗?扔?做错事了吗?