定时取消任务
分类: .Net技术 ◆ 标签: #异步编程 #基础 #.Net ◆ 发布于: 2023-06-04 19:48:39

我们上一章学习了如何手动的取消任何,本章学习使用方法CancellationTokenSource.CancelAfter
定时取消任务,本章的源代码可以在这里找到:https://github.com/hylinux/azure-demo/tree/main/dotnet/basic/asyncdemo/CancelTaskByTime
闲话少说,直接上代码。
创建应用
以如下的命令行创建代码:
mkdir CancelTaskByTime
cd CancelTaskByTime
dotnet new console
替换using
语句
以编辑器打开文件Program.cs
, 替换using语句如下:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Net.Http; using System.Threading; using System.Threading.Tasks;
添加字段
和前面的例子一致:
static readonly CancellationTokenSource s_cts = new CancellationTokenSource(); static readonly HttpClient s_client = new HttpClient { MaxResponseContentBufferSize = 1_000_000 }; static readonly IEnumerable<string> s_urlList = new string[] { "https://docs.microsoft.com", "https://docs.microsoft.com/aspnet/core", "https://docs.microsoft.com/azure", "https://docs.microsoft.com/azure/devops", "https://docs.microsoft.com/dotnet", "https://docs.microsoft.com/dynamics365", "https://docs.microsoft.com/education", "https://docs.microsoft.com/enterprise-mobility-security", "https://docs.microsoft.com/gaming", "https://docs.microsoft.com/graph", "https://docs.microsoft.com/microsoft-365", "https://docs.microsoft.com/office", "https://docs.microsoft.com/powershell", "https://docs.microsoft.com/sql", "https://docs.microsoft.com/surface", "https://docs.microsoft.com/system-center", "https://docs.microsoft.com/visualstudio", "https://docs.microsoft.com/windows", "https://docs.microsoft.com/xamarin" };
更改Main
方法
Main
方法改成如下的形式:
static async Task Main() { Console.WriteLine("Application started."); try { s_cts.CancelAfter(3500); await SumPageSizesAsync(); } catch (TaskCanceledException) { Console.WriteLine("\nTasks cancelled: timed out.\n"); } finally { s_cts.Dispose(); } Console.WriteLine("Application ending."); }
注意这里定时发送取消的Token
, s_cts.CancelAfter(3500)
, 即可定时取消。
定义其他两个异步方法:
static async Task SumPageSizesAsync() { var stopwatch = Stopwatch.StartNew(); int total = 0; foreach (string url in s_urlList) { int contentLength = await ProcessUrlAsync(url, s_client, s_cts.Token); total += contentLength; } stopwatch.Stop(); Console.WriteLine($"\nTotal bytes returned: {total:#,#}"); Console.WriteLine($"Elapsed time: {stopwatch.Elapsed}\n"); } static async Task<int> ProcessUrlAsync(string url, HttpClient client, CancellationToken token) { HttpResponseMessage response = await client.GetAsync(url, token); byte[] content = await response.Content.ReadAsByteArrayAsync(token); Console.WriteLine($"{url,-60} {content.Length,10:#,#}"); return content.Length; }
即可以运行看结果了,这里主要是需要理解方法CancelAfter
。