在.NET 4.0之前,我的理解是,如果一个人想要开始一个线程做一些可以取消的工作,那么就可以开始BackgroundWorker
。 .NET 4带来了TAP模型,以及一大堆新的异步和线程化的东西。 BackgroundWorker
仍然可以这样做吗?
答案 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
语句在线程中止的情况下仍然执行任何清理。