我怎样才能中止等待的任务?

How could I abort an awaited task?

我最近很快了解到,在我的上下文中,所有 Cancellation 令牌的价值在于防止任务被安排。我有很长的 运行ning,我需要在等待的任务中中止单一方法任务。我怎样才能做到这一点?

我的第一个想法是让长 运行ning 方法撕掉另一个线程,但在上面有一个循环不断检查是否 Cancellation.IsCancelled == true,以及何时 true ,我中止了托管长 运行ning 方法的线程。

这很糟糕吗?还有其他方法吗?

顺便说一句,我的长 运行ning 任务是单一方法,所以我可以在它开始 运行ning 之前或在它 运行 之后检查取消令牌,让我没有机会在完成之前停止长 运行ning 方法,例如,为驱动器 C: 上的每个文件收集所有 FileInfo 对象!这是长 运行ning 代码:

FileInfos = Mapper.Map<ObservableCollection<FileInfoViewModel>>(dirInfo.GetFiles($"*.{ext.TrimStart('.')}", SearchOption.AllDirectories));

我可以将它分成两个调用,并检查它们之间的令牌,但这不会有太大影响,或者我可以将 CLR 代码重写为我自己的代码,并手动使用检查令牌的循环。这会起作用,但闻起来很难闻。

用于枚举文件系统实体的底层系统 API 已经支持取消 - 您只需确保使用正确的托管 API.

DirectoryInfo.GetFiles 会将可枚举对象转换为数组 - 这意味着它仅在 returns 收集完所有数据后才会发生。另一方面,DirectoryInfo.EnumerateFiles 将直接公开枚举,您可以随时轻松地停止求值。

还有一些不会被中断的位,但是 Thread.Abort 无论如何也帮不了你 - Thread.Abort 只在线程处于托管代码时杀死线程,以及所有的事情实际上需要时间的是原生的,使用 FindFirstFile/FindNextFile APIs.