2014-10-01 4 views
3

IDbCommand 인터페이스에 비동기 기능을 추가하는 것이 합리적인 방법입니까?비동기 기능이 IDbCommand 인터페이스에서 누락되었습니다.

public async static Task<IDataReader> ExecuteReaderAsync(this IDbCommand self) { 
    DbCommand dbCommand = self as DbCommand; 
    if (dbCommand != null) { 
     return await dbCommand.ExecuteReaderAsync().ContinueWith(task => (IDataReader)task.Result); 
    } else { 
     return await Task.Run(() => self.ExecuteReader()); 
    } 
} 

특히, 내가 완전히 확실하지 않다 무엇을 가짜로 "ContinueWith" "작업"의 공분산을 사용하는 효과.

들어오는 "self"인스턴스가 DbCommand에서 상속되지 않는 경우에는 "self.ExecuteReader()"를 실행하는 동안 스레드 풀 스레드가 사용 및 차단됩니까?

여기 비동기 지원을위한 IDb 확장 기능을 완전히 구현 한 경우 a link입니다.

는 .NET 4.5을 사용하는 경우가

+0

라이브러리를 너겟 패키지로 게시 하시겠습니까? – binki

답변

3

당신은 asyncawait 누락 감사드립니다. 시도하는 방식이 옳고 연결을 개별적으로 처리하기를 바랍니다. 이 청소기이기 때문에

public static async Task<IDataReader> ExecuteReaderAsync(this IDbCommand self) 
{ 
    var dbCommand = self as DbCommand; 
    if (dbCommand != null) 
    { 
     return await dbCommand.ExecuteReaderAsync(); 
    } 

    return await Task.Run(() => self.ExecuteReader()); 
} 
2

그냥, 난 당신이 멀리 ContinueWith()의 캐스트와 함께 할 asyncawait를 사용하고 있다는 사실을 이용할 것입니다. awaitTask<TResult>에서 사용할 경우 TResult 유형의 개체로 평가됩니다. return (IDataReader)await dbCommand.ExecuteReaderAsync(); 구문을 제안하려고했지만 컴파일러가 이미 DbDataReaderIDataReader임을 알고있었습니다. VS 2013 VS 2015 미리보기 테스트 (타겟팅하는지 확실하지 않은,하지만 난 await이 함께 작동해야 지원 모든 C# 컴파일러 가정) : 지금 당신은 풀러 잠재력 await을 사용하고

public async static Task<IDataReader> ExecuteReaderAsync(this IDbCommand self) { 
    DbCommand dbCommand = self as DbCommand; 
    if (dbCommand != null) { 
     return await dbCommand.ExecuteReaderAsync(); 
    } else { 
     return await Task.Run(() => self.ExecuteReader()); 
    } 
} 

및 몇 바이트의 코드를 저장 ;-).

이 구현에서 가장 큰 관심사는 물론 런타임 유형 테스트 인 self as DbCommand입니다. IDbCommand에서 DbCommand으로 모든 항목을 전환해도 문제가없는 경우이 라이브러리를 작성하지 않았으며 런타임 유형 검사가 충분히 수행 가능합니다.

관련 문제