매 x 분마다 스크린 샷 태스크를 실행하려고하지만 주어진 취소 토큰을 사용하여 태스크를 취소하려는 경우 그렇지 않습니다. 아무것도하는 것처럼 보입니다. 여기 다른 메소드에서 호출 된 취소 토큰을 사용하여 태스크를 주기적으로 실행
내 시작 방법 코드 :var CancellationTokenSource = new CancellationTokenSource();
CancellationTokenSource?.Cancel();
CancellationTokenSource = new CancellationTokenSource();
var token = CancellationTokenSource.Token;
await RunPeriodically(async() =>
{
var screenCaptured = TakeScreenshot();
if (screenCaptured == null || CancellationTokenSource.Token.IsCancellationRequested)
return;
var correctUserName = Settings.Default.Username.Split('.');
var parsedUsername = correctUserName[0] + " " + correctUserName[1];
await ScreenshotHelper.UploadScreenshotAsync(ProjectName, "screenshotscontainer",
screenCaptured.ToArray(), Environment.MachineName, parsedUsername);
Console.WriteLine("Took Screenshot: " + DateTime.Now.ToString(CultureInfo.InvariantCulture));
}, TimeSpan.FromSeconds(3), token);
여기에 실행을 주기적 코드 : 나는이 실행됩니다 클래스의 간단한 예를 노크 거라고 생각
public async Task RunPeriodically(Action action, TimeSpan interval, CancellationToken token)
{
while (true)
{
action();
await Task.Delay(interval, token);
}
}
'RunPeriodically' 메소드에서'await'없이'async''Action'을 호출합니다. 그리고 '비동기 무효화'는 일반적으로 나쁜 결정입니다. 다시 디자인하십시오. – dymanoid
왜 취소되지 않는지 알 수는 없지만 다른 문제가 있습니다. 업로드를 '대기'할 때'action()'호출이 _ 반환됩니다. 그래서 아마도 당신이 생각하는 것보다 더 자주 전화했을 것입니다. 그리고'while (true)'는'CancellationToken'을 처리하지 않습니다 (그러나'Task.Delay'는'TaskCancelledException' afaik를 던져야합니다). –
실제로 어떤 시점에서 작업을 취소 하시겠습니까? 당신은 새로운'CancellationTokenSource'를 생성하고 그 사실 후에 결코 그것을 취소하지 않습니다. – Nkosi