以下链接http://msdn.microsoft.com/en-us/library/hh211418(v=vs.110).aspx解释了4.5 .Net框架的新异步编程功能,这在很大程度上是相当直接的前瞻性.
但是,我只是想确定一些事情......
如果我使用的一个SqlDataReader Web服务和创建客户端通过代理服务器产生异步方法(通过服务引用对话框选项)来使用Web服务上的服务的参考,我很想像我不会需要使用上面链接中提到的方法.
相反,我会在调用该Web服务方法时适当地使用客户端上的async,Task和await关键字
自从在"Web服务"对话框中检查这些选项后,它将自动为ADO.Net调用创建异步方法调用.
因此,如果您在Web服务中有一个名为GetCategories的方法,它将自动在Web服务中创建一个名为GetCategoriesAsync的异步调用,该调用可以从客户端调用.同样,不需要将异步属性放在Web服务方法调用上 ; 只为这是一个ADO.Net呼叫不使用Web服务或其中之一是使用Web服务,但不具备异步选项选中.
我的想法是否正确?
我有一个具有Sql-Server数据库后端和Dapper作为ORM的项目。我正在尝试使用Dapper的QueryAsync()方法来获取一些数据。不仅如此,对我的仓库的调用还来自多个用a调用的任务内部Task.WhenAll(也就是说,每个任务都涉及从该仓库中获取数据,因此每个任务都在等待包装该QueryAsync()调用的我仓库的方法)。
问题是即使使用using块,我的SqlConnections也永远不会关闭。结果,我与数据库有100多个开放的连接,最终开始出现“达到最大池大小”异常。问题是,当我切换到just Query()而不是时QueryAsync(),它可以正常工作,但我希望能够异步执行此操作。
这是一个代码示例。我试图尽可能地模仿实际应用的结构,这就是为什么它看起来比必须的更为复杂的原因。
接口:
public interface IFooRepository<T> where T: FooBase
{
Task<IEnumerable<T>> Select(string account, DateTime? effectiveDate = null);
}
Run Code Online (Sandbox Code Playgroud)
实现方式:
public class FooRepository : RepositoryBase, IFooRepository<SpecialFoo>
{
private readonly IWebApiClientRepository _accountRepository;
public FooRepository(IWebApiClientRepository repo)
{
_accountRepository = repo;
}
public async Task<IEnumerable<FuturePosition>> Select(string code, DateTime? effectiveDate = null)
{
effectiveDate = effectiveDate ?? DateTime.Today.Date;
var referenceData = await _accountRepository.GetCrossRefferenceData(code, effectiveDate.Value);
using (var connection = new SqlConnection("iamaconnectionstring")
{
connection.Open(); …Run Code Online (Sandbox Code Playgroud)