我怎么能中止期待的任务?

时间:2016-11-04 08:45:08

标签: c# multithreading asynchronous async-await cancellation-token

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

我的第一个想法是让rip另一个线程用于长时间运行的方法,但是上面有一个循环不断检查是否Cancellation.IsCancelled == true,当它是true时,我中止了托管该线程的线程长期运行的方法。

这不好吗?还有其他方法吗?

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

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

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

1 个答案:

答案 0 :(得分:1)

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

DirectoryInfo.GetFiles会将可枚举变换为数组 - 这意味着它只会在收集完所有数据后返回。另一方面,DirectoryInfo.EnumerateFiles将直接暴露可枚举,您可以随时轻松停止评估。

还有一些不可中断的位,但是Thread.Abort无论如何都无法帮助你 - Thread.Abort只会在托管代码中杀死线程,而实际上所有的东西都会被杀死花时间是原生的,使用FindFirstFile / FindNextFile API。