2013-02-24 5 views
5

새로운 비동기 대기 기능을 내 Entity 모델에서 가져온 저장 프로 시저/함수 가져 오기에 적용하려고했지만 아직 EF6 알파를 사용할 수 없었습니다.EF6 알파 비동기 엔티티 저장 프로 시저/함수 가져 오기를 기다리고 있습니까?

아직 EF6 alpha2 (또는 20211 현재 야간 빌드)에서 Complex Type 컬렉션을 반환하는 Entity Function Import (SQL 저장 프로 시저를 호출)에서 새로운 Async 메서드를 호출 할 수 있습니까? 예 :

private async Task<IList<Company>> getInfo (string id) 
{ 
    using (CustomEntity context = new CustomEntity()) 
    { 
     var query = await context.customStoredProcedure(id).ToListAsync(); 
     // ".ToListAsync()" method not available on above line 

     // OR ALTERNATIVELY 
     var query = await (from c in context.customStoredProcedure(id) 
          select new Company 
          { 
           Ident = c.id, 
           Name = c.name, 
           Country = c.country, 
           Sector = c.sector, 
           etc. etc.... 
          }).ToListAsync(); 
     // ".ToListAsync()" method or any "...Async" methods also not available this way 

     return query; 
    } 
} 

"ToListAsync은", 또는 새로운 비동기 수정 방법 중 하나는 절차/기능 가져 오기 저장 위의 엔티티 사용할 수하지 않는 것; 표준 "ToList"또는 "AsNumerable"등의 메소드 만 사용할 수 있습니다.

나는이 코드 (http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6)를 참조하여 EF5가 아닌 새 EF6 dll을 참조하고 다양한 using 문을 업데이트했는지 확인했습니다. 위에서 외에도 모든 것이 올바르게 구축됩니다. (.NET Framework 4.5)

비동기 메서드를 볼 수있는 유일한 시간은 DB에서 저장 프로 시저를 가져 오는 대신 테이블을 가져 오는 것입니다. 그런 다음 위의 Entity 컨텍스트를 통해 해당 테이블을 참조 할 때 context.SomeTable), 일부 비동기 메소드가 intellisense에 나타납니다.

JSON으로 데이터를 반환하기 전에 다중 비 저장 프로 시저에서 새로운 비동기 대기 기능을 사용하고 싶지만 지금까지는 작동하지 못했습니다.

내가 잘못 했나요? Entity 저장 프로 시저/함수 가져 오기에서 비동기 기능을 사용할 수 있습니까? 조언 해 주셔서 감사합니다.

+0

'context.customStoredProcedure (id) '유형에 정적으로 어떤 유형이 있습니까? – usr

+0

시스템.Data.Entity.Core.Objects.ObjectResult blueFish

+0

작동 시키셨습니까? ASYNC 될 필요가있는 저장 프로 시저 같은 문제가 있습니다. –

답변

4

이제는이 방법이 최선의 해결책은 아닙니다. 확장 메서드를 추가하여 저장 프로 시저를 호출 할 수있었습니다. 최신 버전의 EF6.1 +에서는 공식적으로 구현 된 것을보아야합니다. 그때까지는 더미 확장 메서드가 작업을 수행합니다.

static async Task<List<T>> ToListAsync<T>(this ObjectResult<T> source) 
{ 
    var list = new List<T>(); 
    await Task.Run(() => list.AddRange(source.ToList())); 
    return list; 
} 

당신은 당신이 ObjectResult<T> 실제로 IDbAsyncEnumerable<T>, IDbAsyncEnumerable를 구현하는 것을 볼 수 EF의 버전 6을 반영합니다. ToListAsync<T>(this IDbAsyncEnumerable<T> source)의 메서드는 LINQ 쿼리와 동일한 방식으로 연결해야합니다.

편집 ObjectResult가 비어 있으면 null이 반환됩니다. null 대신 빈 List를 반환하려면 if (source == null) return new List<T>();을 추가 할 수 있습니다.

+4

'Task.Run'으로 새 스레드를 생성하기 만하면 비동기/대기의 목적을 완전히 상실한 메서드를 "기다릴"수 있습니다. 기다리고 나서 주 스레드를 해제했지만 새 스레드를 생성했습니다. 이 새 스레드를 생성하기위한 오버 헤드를 고려한 다음 실제로 생성 한 스레드가 완료되면 주 스레드에서 다시 시작하는 경우 성능이 실제로 저하됩니다. – TugboatCaptain

0

이것은 오래된 스레드이지만 공유해야한다고 느꼈습니다. APM을 사용하여 동기 호출을 태스크에서 랩핑해야합니다.

예 :

var MyResult = await MySPAsync(); 

당신까지 사용할 수 있습니다 : 당신이 실행하고자 할 때

// wraps the method in a task and returns the task. 
public Task<MyResult> MySPAsync() 
{ 
    MySPDelegate caller = new MySPDelegate(MySP); 
    return Task.Factory.FromAsync(caller.BeginInvoke, caller.EndInvoke, null); 
} 

전화 비동기 방식 :

//declare the delegate 
private delegate MyResult MySPDelegate(); 

// declare the synchronous method 
private MyResult MySP() 
{ 
    // do work... 
} 

는 그런 다음 작업의 동기 방법을 포장 메소드의 세 가지 매개 변수에 이릅니다. 모범 사례는 3 개 이상의 매개 변수를 사용하는 경우입니다. 당신은 수업을 통과해야합니다.