相关疑难解决方法(0)

ADO.Net中的异步编程

以下链接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服务,但具备异步选项选中.

我的想法是否正确?

.net c# asp.net wcf asynchronous

5
推荐指数
1
解决办法
4397
查看次数

使用异步时未释放SqlConnection

我有一个具有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)

.net c# database-connection async-await dapper

5
推荐指数
1
解决办法
1377
查看次数