我有一个部署在Windows Server 2008中的Work Tracker WPF应用程序,此Tracker应用程序正在与(Tracker)Windows服务VIA WCF服务进行通信。
用户可以创建任何工作条目/编辑/添加/删除/取消工人跟踪器GUI应用程序中的任何工作条目。在内部,它将向Windows服务发送请求。 Windows服务将获取工作请求并在多线程中处理它。每个workrequest条目实际上将在输出文件夹位置创建n个工作文件(基于工作优先级)。
因此,每个工作请求都将用于完成工作添加过程。
现在我的问题是如果我取消当前正在创建的工作条目。我想在RUNTIME中停止当前的Windows服务工作。为工作创建输出文件的当前线程应该是STOPPED。所有线程都应该被杀死。一旦用户请求取消,就应删除所有线程资源。
我的解决方法:
我使用Windows Service On Custom Command方法在运行时向Windows服务发送自定义值。我在这里实现的是处理当前工作或当前线程(即为收到的工作项创建输出文件)。然后它将转到自定义命令以取消请求。
有没有办法让我们在获得自定义命令后停止工作项请求。
非常感谢任何工作。
答案 0 :(得分:7)
您实际上是在为长时间运行的任务运行任务主机,并且能够取消这些任务。您的具体问题似乎想知道在.NET中实现它的最佳方法。你的架构很好,虽然你勇于推出自己的架构而不是使用现有的框架,但你还没有提到过以后扩展你的架构。
我的偏好是使用TPL Task对象。它支持取消,并且易于轮询进度等。您只能在.NET 4中使用它。
如果没有基本上为您设计整个作业托管引擎并且知道您的.NET版本,则很难提供代码。我已经在下面详细描述了这些步骤,并参考了示例代码。
使用Windows服务OnCustomCommand的方法很好,如果您有客户端服务通信选项,也可以使用消息服务(见下文)。这对于您有许多客户端与中央作业服务进行通信,并且作业服务与客户端不在同一台计算机上的情况更为合适。
在我们查看您的确切背景之前,最好先查看MSDN - Asynchronous Programming Patterns。在线程上运行和取消作业有三种主要的.NET模式,我按优先顺序列出它们:
架构
想象一下这就像基于REST的服务。
这样客户端就完全与作业引擎的工作隔离,并且可以随着时间的推移改进作业引擎。
作业引擎
方法如下:
当客户端想要结果时,他们使用UID发送请求,并通过检查从字典中检索的任务来返回进度。如果任务完成,他们可以发送完成数据的请求,或者在您的情况下,只需去阅读已完成的文件。
当他们想要取消时,他们会发送带有UID的请求,并通过在字典中找到它并告诉它取消来取消任务。
在您的代码中,您需要定期检查取消令牌,看看是否应停止运行代码(如果您使用的是TAP模式,请参阅How do I abort/cancel TPL Tasks?,或Albahari if you are using EAP)。此时您将退出作业处理,如果设计得好,您的代码应该在需要时处理IDiposables,从内存中删除大字符串等。
取消的基本前提是您检查取消令牌:
for
,foreach
,do
或while
)内,检查每次迭代您需要定义对取消做出反应的速度 - 对于Windows服务,它应该在几毫秒内,最好是确保窗口在重新启动或停止服务时没有问题。
有些人使用线程完成整个过程,并通过终止线程 - 这很难看,不再推荐了。
<强>可靠性强>
您需要问:如果您的服务器重新启动,Windows服务崩溃,或者发生任何其他异常导致您丢失不完整的工作,会发生什么?在这种情况下,您可能需要一个可靠的队列体系结构,以便能够重新启动作业,或重建您尚未开始的作业队列。
如果您不想扩展,这很简单 - 使用Windows服务存储作业信息的本地数据库。
如果你想扩展,或者你的客户在许多计算机上,并且你有一个工作引擎&#34; farm&#34;一个或多个服务器,然后查看使用消息队列而不是使用OnCustomCommand
直接通信。
消息队列有多种好处。它们将允许您可靠地将作业提交到中央队列,然后许多工作人员可以接收并处理这些作业,并将您的客户端和服务器分离,以便您可以扩展您的作业运行服务。它们用于确保以高度分离的方式可靠地提交和处理作业,这可以在本地或全局工作,但始终可靠,您甚至可以将其与在云工作者上运行Windows服务相结合,您可以动态扩展。 / p>
技术的例子是MSMQ(如果你想维护自己的,或者必须留在你自己的防火墙内),或Windows Azure Service Bus (WASB) - 这是便宜的,已经为你完成了。在任何一种情况下,您都希望使用Patterns and Best Practices for Enterprise Integration。对于WASB,则有many (MSDN),many (MSDN samples for BrokeredMessaging etc.),many (new Task-based API)开发人员资源和NuGet packages供您使用