2014-04-11 2 views
5

DB에서 데이터를 가져 오기 위해 Microsoft.Practices.EnterpriseLibrary.Data을 사용하는 곳에 내가 작성한 이전 응용 프로그램이 있습니다. 나는 최근에 .NET 4.5로 업그레이드하여 await/async을 이용하고 싶었습니다.await/async Microsoft Practices 엔터프라이즈 라이브러리 데이터

패키지의 최신 버전에서도 이름 지정 표준에 따라 "비동기"로 끝나는 메소드가 표시되지 않습니다. 수동으로 비동기로 만들지 않고이 ADO .NET 라이브러리와 함께 await/async를 사용할 수 있습니까?

답변

6

실제로 비동기 방법을 찾을 수 있었다과 함께 Task.Factory.FromAsync을 사용하여 파일을 읽고 그것을 사용의 예입니다. 나는 틀린 반점에서 다만보고 있었다.

 var db = DatabaseFactory.CreateDatabase(GlobalConstants.DBConnection); 
     using (var cmd = db.GetStoredProcCommand("SprocName", parameterA)) 
     { 
      await cmd.ExecuteNonQueryAsync(); 
     } 

하고 데이터를 얻을하고자 할 때 : 당신은 많은 양의 데이터 CommandBehavior.SequentialAccess를 사용하는 경우

 var db = DatabaseFactory.CreateDatabase(GlobalConstants.DBConnection); 
     using (var cmd = db.GetStoredProcCommand("SprocName", parameterA, parameterB, parameterC)) 
     { 
      using (var dr = await cmd.ExecuteReaderAsync()) 
      { 
       while (await dr.ReadAsync()) 
       { 
        return dr.GetInt32(0); 
       } 
      } 
     } 

당신은 GetFieldValueAsync<T> 대신 GetInt32 사용할 수 있습니다 여기에 비동기 적으로 DB에 접근하는 두 가지 일반적인 방법입니다. 그러나 대부분의 경우이 작업을 수행하지 않아도됩니다.

+0

연결을 여는 방법은 무엇입니까? –

+2

실제로 이러한 메소드가 표시되지 않습니다. Nuget을 통해 최신 엔터프라이즈 라이브러리 데이터를 얻었지만 여전히 이러한 메소드를 찾을 수 없습니다. ent lib 버전을 알려 주실 수 있습니까? – Bala

+1

ExecuteReaderAsync는 엔터프라이즈 라이브러리에서 가져온 것이 아닙니다. - https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executereaderasync(v=vs.110).aspx – StingyJack

0

, 당신은 Task.Factory.FromAsync와 함께 사람들을 사용할 수 있습니다. 더 많은 정보 here. 여기

filestream.BeginReadfilestream.EndRead

private async Task<string> ReadFileAsync() 
{ 
    var fileStream = File.OpenRead("..\\..\\..\\test.txt"); 
    var buffer = new byte[1024]; 

    await Task<int>.Factory.FromAsync(fileStream.BeginRead, fileStream.EndRead, buffer, 0, buffer.Length, null); 

    return System.Text.Encoding.ASCII.GetString(buffer); 
} 
6

Begin */End * 메소드를 제공하지만 비동기 버전은 제공하지 않는 이전 버전의 EL을 사용하고 있습니다. 간단한 확장 방법으로 생활을 단순화합니다.

public static async Task<IDataReader> ExecuteReaderAsync(this SqlDatabase database, DbCommand command) 
{ 
    return await Task<IDataReader>.Factory.FromAsync(database.BeginExecuteReader, database.EndExecuteReader, command, null); 
} 

public static async Task<object> ExecuteScalarAsync(this SqlDatabase database, DbCommand command) 
{ 
    return await Task<object>.Factory.FromAsync(database.BeginExecuteScalar, database.EndExecuteScalar, command, null); 
} 

public static async Task<XmlReader> ExecuteXmlReaderAsync(this SqlDatabase database, DbCommand command) 
{ 
    return await Task<XmlReader>.Factory.FromAsync(database.BeginExecuteXmlReader, database.EndExecuteXmlReader, command, null); 
} 

public static async Task<int> ExecuteNonQueryAsync(this SqlDatabase database, DbCommand command) 
{ 
    return await Task<int>.Factory.FromAsync(database.BeginExecuteNonQuery, database.EndExecuteNonQuery, command, null); 
} 
관련 문제