首先,我要解释我正在尝试做什么,然后直接提出问题。基本上,在特定机器上运行Windows服务,我们称之为M1。此Windows服务使用线程运行一组任务(每个任务分区有1个线程)。我需要编写一个功能,让用户从应用程序的管理面板停止/挂起/重新启动分区。我的解决方案在于通过id / name访问这些线程。一旦我有了线程,我就可以对它进行正确的操作。这是正确的方法吗?
如果是,我们该怎么做?线程在M1中运行,我需要从远程计算机(位于同一网络区域)访问它们。它甚至可能吗?
谢谢。如果需要,请不要犹豫,要求更多解释。
答案 0 :(得分:2)
直接控制线程管理到远程进程是解决此问题的危险方法。您可以设置一个线程来侦听要挂起的请求等,并代表请求者操作线程。但是这可能会导致无穷无尽的问题,因为您在挂起它时不知道线程处于什么状态。特别是,它可以保持锁定,或者处于数据库事务的中间。
如果任务是短暂的,那么每当完成当前的杂务时,让每个线程请求都可以从老板处理。要暂停一个分区,告诉老板(通过TCP,Web服务或其他)不要再给分区的线程工作,直到另行通知为止。
答案 1 :(得分:2)
我不认为这是正确的做法。 将服务中的接口更好地提供管理线程的功能。
答案 2 :(得分:1)
我会通过TCP或.NET远程处理与流程进行通信,并使用定义要执行的任务所需的参数。
然后,您将需要一个管理此请求的类,并与线程通信,告诉他们该做什么。
答案 3 :(得分:1)
我不会使用线程ID。线程名称是可能的,但我倾向于为每个任务提供一个名称并对其进行键入。
如果我正在解决此问题,我会在您的Windows服务上公开Window Communication Foundation (WCF)接口。然后,您的应用程序将通过该界面控制任务。
我会避免使用.NET Remoting。它会起作用,但是.NET Remoting has been superseded by WCF。来自MSDN文章:
WCF早些时候取代了几个 用于创建的Microsoft技术 分布式应用。最 原本应用程序 使用ASP.NET Web Services,.NET构建 远程处理,企业服务, System.Messaging或WSE将改为 建立在WCF上。