다중 클라이언트 객체가 인터페이스를 통해 특정 함수를 구현할 것으로 예상되는 시스템에서 작업하고 있는데,이 함수가 연속과 비동기로 실행되도록하고 싶습니다. (구현이 I / O 바인딩 일 것으로 기대하고 있습니다. 가능한 빨리 모든 클라이언트 오브젝트가이 기능을 완료하는지 확인하십시오. Visual Studio 비동기 CTP 새로 고침 SP1, C #"5.0"사용하고 있습니다.
내 추상 클래스의 자식 객체에서 비동기 동작을 적용하는 데 권장되는 방법은 무엇입니까 (아래 참조)? 가상 메서드 접근법을 사용하여 '비동기'메서드를 사용할 수 없습니다 (분명히). 나는 'Task'리턴 타입만을 요구할 수있다. 이것은 자식 객체에서 비동기 동작을 요구하지 말아야한다는 것을 의미합니까? 이 경우 반환 유형을 단순히 'void'로해야합니까?
공개 인터페이스는 현재 시스템 설계의 불행한 결과이지만, 이는 별개의 문제입니다. 분명히, 나는 'BaseFoo'를 우회하여 'IFoo'인터페이스 만 구현하는 비동기적인 사람을 제한 할 수 없습니다.
다음은 코드입니다.
public interface IFoo
{
void Bar(); //NOTE: Cannot use 'async' on methods without bodies.
}
public abstract class BaseFoo : IFoo
{
public async void Bar()
{
await OnBar(); //QUESTION: What is the right "async delegation" pattern?
}
protected virtual async Task OnBar()
{
await TaskEx.Yield();
}
}
public class RealFoo : BaseFoo //NOTE: May be implemented by 3rd party
{
protected override async Task OnBar()
{
//CLIENT: Do work, potentially awaiting async calls
await TaskEx.Yield(); //SECONDARY QUESTION: Is there a way to avoid this if there are no 'awaits' in the client's work?
}
}
메소드가 다음을 사용하여 구현되는지 여부async
/await
또는 아닙니다이행세부 묘사. 방법은 어떻게해야합니까?굴다계약 세부 사항이며 정상적인 방법으로 지정해야합니다.
이 메소드가Task
또는Task<T>
, 그것은 비동기가 될 것이라는 것이 더 분명하고 구현하기가 어려울 것입니다없이비동기입니다.
반면에 구현 (예 : 테스트 목적)이있는 경우await
표현은못불완전 해지면 왜 누군가가 비동기 메소드를 쓰도록 강요하고 싶습니까?await
어쨌든 전화 했어? 너는기대하는구현은 IO 바인딩이 될 수 있지만 구현이 하드 코딩 된 데이터 등을 사용하려는 특별한 경우가있을 수 있습니다.
기본적으로 메서드에 대한 설명서에서이 문제를 처리해야합니다. 구현자를 읽을 수 없다면 어쨌든 기회가 없습니다.
존의 답변에 덧붙여,작업 기반 비동기 패턴메소드 이름의 접미사는Async
이것은 비동기 방식이라는 자체 문서입니다.
인터페이스를 구현하는 경우
public interface IFoo
{
Task BarAsync();
}
이 기능을 구현해야한다는 것은 분명합니다.async
예어.
Task
반환 유형보다void
어디에서나 할 수 있습니다 -void
대부분 비동기 메서드를 사용하여 이벤트 처리기를 구현할 수 있습니다. 비동기 메소드가 완료 될 때까지 기다릴 수있는 경우가 많으며Task
그렇게 쉽게. - Jon Skeet