什么是C#/ .NET 4.0+实现可取消后台线程的方法?

时间:2015-05-11 19:00:08

标签: c# .net multithreading .net-4.0

在.NET 4.0之前,我的理解是,如果一个人想要开始一个线程做一些可以取消的工作,那么就可以开始BackgroundWorker。 .NET 4带来了TAP模型,以及一大堆新的异步和线程化的东西。 BackgroundWorker仍然可以这样做吗?

2 个答案:

答案 0 :(得分:5)

在现代代码中,我建议将 "<templateId>" + templateId + "</templateId>" + "<templateRoles>" + "<templateRole>" + "<name>" + recipientName + "</name>" + "<email>" + recipientEmail + "</email>" + "<roleName>" + roleName + "</roleName>" + ====== My code modifications ====== "<tabs>" + "<signHereTabs>" + "<xPosition>100</xPosition>" + "<yPosition>200</yPosition>" + "<documentId>1</documentId>" + "<pageNumber>1</pageNumber>" + "</signHereTabs>" + "</tabs>" + ===================================== "</templateRole>" + "</templateRoles>" + "</envelopeDefinition>"; Task.Run一起使用。相比之下,CancellationToken取消风格相当复杂:它需要BackgroundWorker委托来监控自己的DoWork实例,并将取消请求视为布尔值而不是异常。

我有一个更详细的blog post

答案 1 :(得分:3)

请注意async(以及推论关键字await)都是.NET 4.5,在4.0中不可用。如果您想使用Task,我强烈建议您升级到.NET 4.5。但是,即使在4.0中,也有几种重载方法可选择使用CancellationToken来取消正在运行的工作。

编辑正如评论中所指出的那样,在{...}上获得async / await are ways - 您只需要更少的工作和更多的工作图书馆支持4.5。在没有急需XP支持的情况下,我不推荐这样做。

从.NET 4.5开始,BackgroundWorker类未标记为[Obsolete],因此您无法直接继续使用它。

The Thread class包含直接.Abort()方法,可用于创建可以取消的工作程序。请注意,此中止是通过在正在运行的线程中抛出ThreadAbortException来实现的,从而允许catch语句在线程中止的情况下仍然执行任何清理。