2017-04-05 1 views
0

동시에 여러 쿼리를 실행할 수 있도록 코드를 만들려고 노력하고 있습니다.하지만 devart havent가 aswait/async를 구현하기 때문에 몇 가지 문제가 있습니다. 그것이 작동되도록 제대로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를 사용하는 방법을 알아낼 질수 있다는 것입니다 드라이버에있다, 나는 그래서 내가 어디 보통 OracleDataReader로 끝날

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); 

같은 끝낼 내가 사용하는 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의 havent 한 구현이/비동기를 기다리고로, 나는 몇 가지 문제는 그것이

제대로 작동하는 방법을 파악해야

Async/Await을 구현하지 않았다는 것을 어떻게 알 수 있습니까? IDbConnection 인터페이스를 구현 했으므로 Dapper와 함께 비동기 호출을 할 수 있습니다. 그런 다음 대부분의 질문은 다른 질문 중 하나임 Dapper not running Async together with Devart oracle driver, 코드 스 니펫으로 대답했습니다. 이 외에도 Devart는 Async-Await의 전신 인 BeginXX, EndXX (APM 모델)을 구현했으며, 자세한 기능으로 동일한 기능을 수행하는 데 도움이되는 Asynchronous Programming Model이라고합니다. 비동기의 목적은 비동기 적 방법을 실행하기 위해 스레드 풀 스레드를 호출하여 패배로

내 첫번째 생각은 단지

이 아이디어를 내 저장소에 전화를 포장하는 것이었다 따라서, 스레드 풀 단순히 나쁜 쓰레드는 데이터베이스와 같은 원격 프로세스에 디스패치되는 실제 비동기 호출에는 필요하지 않습니다.또한 심지어는 비동기 API를 사용할 수, APM 및 비동기-기다리고 있습니다이

내가 말끔이 BeginExecuteReader 및 EndExecuteReader를 사용하는 방법을 알아낼 질수 있음을, 내가

같은 끝낼

문제가이 있기 때문에 여기에 필요하지 그것에 대해

이유는 이러한 호출도, 이러한 호출은, 당신은 Devart를 사용하여 직접 통화를하는 경우, 단정 한 당신에게 DataReader 및 기타 ADO.Net 작업 할 수있는 옵션을 제공하지 않는 단정 함께 사용할 수 생각하지 않는 것입니다 객체를 내부적으로 사용하므로 객체를 직접적으로 사용할 수 있습니다.

Code Snippet는 비동기 API를 통해 사실에 완벽하게 제어하려는 경우 DataReaderAsync에 관련 Best method to use IDataReader as IEnumerable<T>?

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

마지막 부분을 확인, 사용자 지정 코드와 IEnumerable<T>를 생성하기 위해 내부적으로 사용할 수 있으며, 완벽하게 괜찮습니다 실행중인 코드 Sync 모드는 Devart에서 비동기 메서드 구현을 확인하고 내부적으로 호출을 Sync 함수로 리디렉션 할 때까지 단순한 가정으로 보입니다. 주로 대부분 Task.Factory.FromAsync을 사용하여 APM을 호출합니다. 메서드를 사용하거나 비동기 버전을 생성하는 표준 메커니즘 인 TaskCompletionSource<T>을 사용하여 Truly Async 메서드를 구현했을 것입니다.

+0

가정을 작성하는 대신 비동기 호출의 Devart 구현을 확인하십시오 –

관련 문제