2014-02-27 2 views
2

내부적으로 API를 노출하려는 경우 사용자가 취소 할 수있는 작업 시퀀스를 예약합니다. 예 :취소 가능한 작업 API를 노출하는 올바른 방법

public ??? DoWork() 
{ 
    Task t = new .... , myCancellationToken); 
    return ??? 
} 

취소 제어를 위해 반환 할 올바른 개체는 무엇입니까? CancellationTokenSource입니까?

public CancellationTokenSource DoWork() 
{ 
    CancellationTokenSource source = new .... 
    Task t = new .... , source.Token); 
    return source; 
} 

전혀 반환해야합니까? CancellationToken을 arg로 받아 들여 필요한 경우 사용자가 토큰 소스를 만들도록해야합니까?

public void DoWork(CancellationToken token) 
{ 
    Task t = new .... , token); 
} 

이 문제를 해결하는 가장 관용적 인 방법은 무엇입니까?

답변

6

CancellationToken을 arg로 받아 들여 필요한 경우 사용자가 토큰 소스를 만들도록해야합니까?

이것은. 하지만 사용자가 완료 될 때이를 관찰 할 수 있도록 Task도 반환해야합니다. 물론 비동기/대기 상태로 전환 할 수 있습니다.

또한 과부하를 할 수 있습니다 :

public Task DoWork() 
{ 
    return DoWork(CancellationToken.None); 
} 

public Task DoWork(CancellationToken cancellationToken) 
{ 
    ... 
} 

는 이런 종류의 물건에 대한 일반적인 규칙에 대한 Task-based Asynchronous Pattern를 참조하십시오.

+0

이제는 이것이 정말로 과부하로 쓰여지는지 궁금 해서요, 아니면 선택적인'CancellationToken? '매개 변수의 기본값이'null'인지 궁금합니다. –

+0

나 자신에게 대답하기 위해서 : 나는 개인적인 취향의 문제라고 생각하고있다. –

+0

@StevenLiekens .Net 자체는 선택적 매개 변수가 아닌 오버로드를 사용합니다. 그 팁은 과부하에 찬성하여 비늘을 조금칩니다. – i3arnon

0

비동기 메서드는 작업을 반환해야합니다. IAsync를 사용하여 콜백 패턴을 구현하지 않은 경우 동기화 작업을 수행하고 결과를 가져 오는 작업이 필요합니다. 비동기로 메소드를 표시하고이를 호출하면 결과는 태스크에서 자동으로 풀립니다. 작업이 TPL에서 중요한 포인트입니다. 명시 적으로 할 필요가 없다면 새로운 태스크를 만들지 말고 정적 인 Run 메소드를 대신 사용하십시오.

관련 문제