我最近很快就了解到,在我的上下文中,所有Cancellation
令牌都值得阻止任务被安排。我有一个长期运行的单一方法任务,我需要在等待的任务中中止。我怎样才能做到这一点?
我的第一个想法是让rip另一个线程用于长时间运行的方法,但是上面有一个循环不断检查是否Cancellation.IsCancelled == true
,当它是true
时,我中止了托管该线程的线程长期运行的方法。
这不好吗?还有其他方法吗?
顺便说一下,我的长时间运行任务是一个单一的方法,所以我可以在开始运行之前检查取消令牌,或者在它运行之后检查取消令牌,让我没有机会在它完成之前停止长时间运行的方法,例如,为驱动器C上的每个文件收集所有FileInfo
个对象:!这是长期运行的代码:
FileInfos = Mapper.Map<ObservableCollection<FileInfoViewModel>>(dirInfo.GetFiles($"*.{ext.TrimStart('.')}", SearchOption.AllDirectories));
我可以将它分成两个调用,并检查它们之间的令牌,但是它不会产生太大影响,或者我可以将CLR代码重写为我自己的代码,并手动使用检查令牌的循环。这会奏效,但闻起来很糟糕。
答案 0 :(得分:1)
用于枚举文件系统实体的底层系统API已经支持取消 - 您只需确保使用正确的托管API。
DirectoryInfo.GetFiles
会将可枚举变换为数组 - 这意味着它只会在收集完所有数据后返回。另一方面,DirectoryInfo.EnumerateFiles
将直接暴露可枚举,您可以随时轻松停止评估。
还有一些不可中断的位,但是Thread.Abort
无论如何都无法帮助你 - Thread.Abort
只会在托管代码中杀死线程,而实际上所有的东西都会被杀死花时间是原生的,使用FindFirstFile
/ FindNextFile
API。