2012-01-24 4 views
5

TPL을 .NET 4와 함께 사용하여 미래를 다루는 API를 설계하는 방법을 결정하려고합니다. 내가 비동기 패턴을 모방하는 것이었다에 발생하지만, End(IAsyncResult) 방법이없는 하나의 가능성 : 이와 같이이 TPL 관용어가 있습니까?

public Task<int> BeginGetAge() 
{ 
    // create and return task 
} 

public int GetAge() 
{ 
    return this.BeginGetAge().Result; 
} 

는 발신자가 차단 또는 GetAge()의 버전을 비 차단 호출 여부를 결정할 수 있습니다. 또한, 그들은 미래에 접근 할 수 있기 때문에 그 위에 연속성을 구축 할 수 있습니다.

이 관용구가 유효합니까? 명백한 결점이나 문제가 있습니까? 공식 이름이 있나?

+0

두 번째 사례는 '기다리는 것'으로 크게 도움이됩니다. – user7116

+0

FYI, Stephen Toub이 (비동기 메서드에 대한 동기화 래퍼 제공) - tl; dr avoid this에 게시했습니다. http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638을 참조하십시오. aspx 및 http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx –

답변

3

Task을 반환하는 것은 새로운 C# 5 비동기 방식입니다. TAP : Task-based Asynchronous Pattern이라고합니다.

유일한 차이점은이 메서드의 이름이 GetAgeAsync입니다.

그렇습니다.이 방법을 사용하면 C# 5 비동기로 릴리스 할 때 쉽게 포팅 할 수 있으므로 권장됩니다.

+0

매우 유용한 참조 - 감사. –

2

이 관용구는 나에게 완벽하게 유효하며 실제로 비동기 기반의 Task에 대한 지원은 곧 출시 될 닷넷 버전에서 큰 특징이 될 것입니다.

그러나 차단 방법 GetAge이 비동기 메서드를 호출하지 않고 대기 할 때까지 구현을 변경 한 다음 기다립니다. 잠재적으로 새 스레드를 만드는 데 필요한 오버 헤드가 필요하지 않습니다.

+0

메소드 간의 관계를 바꿀 수 있고'BeginGetAge()'가'Task .Factory.StartNew (() => GetAge())'를 리턴 할 수 있습니다. –

+0

@SeanU 정확하게. –

+1

글쎄, 나는 기존 스레드에 스위치 컨텍스트만큼 새로운 스레드를 생성 할 것이라고 생각하지 않는다. 그리고 이것이 필요한지 여부를 결정하는 것은 스케줄러에게 달려 있습니다. 그러나 나는 당신의 요점을 알고 숀의 제안은 의미가 있습니다. –