2017-04-05 114 views
0

我试图让我的代码能够在同一时间运行多个查询,但作为实施devart还没有等待/异步,我有一些问题搞清楚如何使其正常工作是否有可能换Devart Oracle驱动程序,使之异步

我的第一个想法是刚刚换我的仓库电话与

public Task SleepAsync(int millisecondsTimeout) 
{ 
    return Task.Run(() => Sleep(millisecondsTimeout)); 
} 

但从https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/这听起来像一个坏主意,真的不一事无成

所以我一直在寻找异步功能Devart在司机 https://www.devart.com/dotconnect/oracle/articles/asynchronous.html

的问题是,我无法弄清楚如何使用这个BeginExecuteReader和EndExecuteReader用短小精悍,我结束了类似

await Task.Factory.FromAsync(sqlConnection.BeginOpen, sqlConnection.EndOpen, null); 
var oracleCommand = new OracleCommand(sql, sqlConnection); 

OracleDataReader result = await Task.Factory.FromAsync(oracleCommand.BeginExecuteReader, oracleCommand.EndExecuteReader, null); 

所以我最终OracleDataReader而正常情况下我想用结束了的IEnumerable:

IEnumerable<TModel> elements = await sqlConnection.QueryAsync<TModel>(sql, parameters); 

我已经第一次尝试是使用只写它小巧玲珑

保护异步任务GetElement(字符串SQL,对象参数= NULL)

{ 
    using (var sqlConnection = new OracleConnection(Connectionstring)) 
    { 
     await sqlConnection.OpenAsync(); 
     var element = await sqlConnection.QuerySingleAsync<TModel>(sql, parameters); 

     return element; 
    } 
} 

但是,这并不异步

运行是否可以继续使用小巧精致,并使它真正异步?

+0

我不使用Dapper,但是我发现这个[github页面](https://github.com/StackExchange/ Dapper/blob/master/Dapper/SqlMapper.Async.cs),它概述了.NET 4.5的异步调用。这有帮助吗? – tbone

+0

**但是那不会运行异步**,你怎么知道你的代码没有运行异步,因为我看到两个'await'语句,无论如何,它们依次运行,即使你的调用线程被切回到调用者,由于'await' –

回答

0

有情侣在这里混了点,让我尝试通过一个澄清他们一个。

我试图让我的代码能够在同一时间运行多个查询,但作为实施devart还没有等待/异步,我有一些问题搞清楚如何使其正常工作

你怎么知道他们还没有实现Async/Await,因为他们已经实现了IDbConnection界面,您可以用小巧玲珑用于拨打异步调用,那么大多是这是一个猜测,在您的其他问题Dapper not running Async together with Devart oracle driver之一,我已经回复了一段代码片段。在这旁边,Devart已经实施BeginXXEndXX,(APM模式),这对于Async-Await的前身,被称为Asynchronous Programming Model,这应有助于实现一个详细的方式相同的功能。

我的第一个想法是刚刚换我的仓库电话与

这种想法简直是糟糕的异步的目的是通过调用线程池线程异步运行的方法击败,从而线程池线程仍在等待,这不是真正的异步调用,它被分派到像数据库的远程过程所需。此外它不是即使在这里需要的,因为你有异步API的使用,APM和异步等待

的问题是,我无法弄清楚如何使用这个BeginExecuteReader和EndExecuteReader用短小精悍,我结束了类似

原因是这些电话甚至不会与Dapper一起使用,这些是电话,如果您使用Devart直接拨打电话,Dapper不会为您提供与DataReader和其他ADO.Net直接对象,因为它在内部与它们一起工作。

Code Snippet是完全正常的,如果你想对异步API和事实上完全控制DataReader可用于内部产生IEnumerable<T>自定义代码,查Best method to use IDataReader as IEnumerable<T>?

OracleDataReader result = await Task.Factory.FromAsync(oracleCommand.BeginExecuteReader, oracleCommand.EndExecuteReader, null);

最后一部分涉及到Async代码运行是Sync模式似乎只是假设,直到并且除非您已验证,Devart中的异步方法实现,并且它们在内部将该调用重定向到Sync函数,大多数情况下它们将使用Task.Factory.FromAsync来调用其APM方法或将实施真正的异步方法使用TaskCompletionSource<T>,这是创建异步版本的标准机制

+0

请验证Devart实现的异步调用,而不是做出假设 –

相关问题