인위적인 예,하지만은 비동기 방식으로 다음 내가 가진 가정 :폐기 CancellationTokenRegistrations
라고 초 콜백 몇 이후로 한, 예상대로이 작동var cts = new CancellationTokenSource();
cts.CancelAfter(2000);
cts.Token.Register(Callback);
SomethingThatMightThrow();
await Task.Delay(10000, cts.Token);
. 콜백이 await Task.Delay...
에서 예외로 등록 원인이 아마도 때문이라고, 하지,이 경우
var cts = new CancellationTokenSource();
cts.CancelAfter(2000);
using (cts.Token.Register(Callback))
{
SomethingThatMightThrow();
await Task.Delay(10000, cts.Token);
}
: 그러나, 나는 Task.Delay
후 등록을 처분하려는, 그래서 다음 수정을한다고 가정 호출되기 전에 처리됩니다.
Callback
이 취소시 호출되고 등록이 항상 처리되도록하는 가장 좋은 방법은 무엇입니까?
나는 다음과 같은 생각 못했지만, 나는 그것이 얼마나 강력한 확실하지 않다 : 일반적으로 통지의 다른 종류를 사용하는 이전의 시스템과 새로운 CancellationToken
시스템 상호 운용성하는 데 사용됩니다
var cts = new CancellationTokenSource();
cts.CancelAfter(2000);
var ctr = cts.Token.Register(Callback);
try
{
SomethingThatMightThrow();
await Task.Delay(10000, cts.Token);
}
finally
{
if (!cts.Token.IsCancellationRequested)
ctr.Dispose();
}
/은'Callback' 호출 할 것으로 예상하거나 더 이상 콜백을 원하는 것이 그 후에 코드 내 어떤 지점이있는 경우 CancelAfter 시간이 지난 경우에도 호출 할 수 있습니다. 콜백이 호출되기를 원한다면 (나머지 코드가 완료되었다하더라도),'Callback'에'CancellationTokenRegistration'을 처분하십시오. –
관련 : http://stackoverflow.com/questions/21367695/why- 존재하지 않는 이유가 무엇인가요? –
@MattSmith -'Callback'은'SomethingThatMightThrow(); 중에 취소가 요청 된 경우에만 호출되기를 원했습니다. 작업을 기다리고 있습니다. 지연 (10000, cts.Token); 차단. – Duncan