WinRT 비동기 작업을 취소하는 올바른 방법
Windows 8 WinRT에서 작업은 비동기 작업을 수행하는 메커니즘을 제공합니다. 그러나 작업 취소를 처리하는 것은 까다로울 수 있습니다.
다음 코드를 고려하세요.
<code class="language-csharp">private async void TryTask() { CancellationTokenSource source = new CancellationTokenSource(); source.Token.Register(CancelNotification); source.CancelAfter(TimeSpan.FromSeconds(1)); var task = Task<int>.Factory.StartNew(() => slowFunc(1, 2), source.Token); await task; if (task.IsCompleted) { MessageDialog md = new MessageDialog(task.Result.ToString()); await md.ShowAsync(); } else { MessageDialog md = new MessageDialog("Uncompleted"); await md.ShowAsync(); } } private int slowFunc(int a, int b) { string someString = string.Empty; for (int i = 0; i < 1000000; i++) { someString += i.ToString(); } return a + b; }</code>
CancelNotification
메소드가 호출되었음에도 불구하고 작업은 백그라운드에서 계속 실행되어 완료됩니다. 취소 시 작업을 완전히 중지하려면 다음 지침을 따르세요.
CancellationToken
를 전달합니다. CancellationToken
해야 합니다. 개선된 코드는 다음과 같습니다.
<code class="language-csharp">private async Task TryTask() { CancellationTokenSource source = new CancellationTokenSource(); source.CancelAfter(TimeSpan.FromSeconds(1)); Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token); // (取消的任务在等待时会引发异常)。 await task; } private int slowFunc(int a, int b, CancellationToken cancellationToken) { string someString = string.Empty; for (int i = 0; i < 1000000; i++) { cancellationToken.ThrowIfCancellationRequested(); // 检查取消请求 someString += i.ToString(); } return a + b; }</code>
이러한 수정을 통해 작업 실행 중에 작업이 취소되면 작업이 완전히 취소되고 대기 중에 예외가 발생합니다.
위 내용은 WinRT에서 비동기 작업을 올바르게 취소하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!