【问题标题】:C# - How to access a remote thread?C# - 如何访问远程线程?
【发布时间】:2010-07-05 12:30:02
【问题描述】:

首先,在直接提问之前,我将解释我想要做什么。基本上,在特定的机器上运行着一个 Windows 服务,我们称之为 M1。此 Windows 服务使用线程运行一组任务(每个任务分区一个线程)。我需要编写一个功能,让用户从应用程序的管理面板停止/暂停/重新启动分区。我的解决方案包括通过它们的 id/name 访问这些线程。一旦我有了线程,我就可以对其进行正确的操作。这是正确的方法吗?

如果是,我们该怎么做?线程在 M1 中运行,我需要从远程计算机(位于同一网络区域)访问它们。有没有可能?

谢谢。如果需要,请随时要求更多解释。

【问题讨论】:

  • 你能在远程机器上启动 .exe 吗?如果是,您可以使用 .Net Remoting。

标签: c# multithreading windows-services


【解决方案1】:

将线程管理的直接控制权交给远程进程是解决此问题的危险方法。您可以设置一个线程来侦听挂起等请求,并代表请求者操作线程。但这可能会导致无穷无尽的问题,因为您不知道挂起线程时线程处于什么状态。特别是,它可能持有锁,或者处于数据库事务的中间。

如果任务是短暂的,则让每个线程在完成当前任务时向老板请求工作。要挂起一个分区,请告诉老板(通过 TCP、Web 服务或其他方式)在另行通知之前不要让该分区的线程继续工作。

【讨论】:

  • 其实这些任务都不是昙花一现的。我们要停止/暂停分区的原因是某些任务需要很长时间才能完成,例如,如果我们想更改参数,我们必须等到任务结束执行。
  • @Amokrane:如果必须等待它完成才能更改参数,那么暂停任务有什么帮助?
  • 其实我说的是existant代码。提供这个新功能可以让人们在任务结束之前停止线程并更改参数。
  • @Amokrane:任务如何使用这些参数?在线程挂起而不是在运行时更改它们如何安全?
  • @Marcelo:这些参数仅用于调度任务(StartTime/Period)。如果有人需要以不同的方式调度任务,他需要先停止它,因为只有在任务重新启动时才会进行调度。如果任务消耗过多的 CPU 周期(例如,某些任务执行的导入操作可能非常长且消耗量),则暂停可能很有用。我们暂停它,让其他任务更快地执行它们的操作。
【解决方案2】:

我不认为这是正确的方法。 服务中的接口会更好地为管理线程提供功能。

【讨论】:

  • 你的意思是设置一个 Web 服务来管理远程机器上的线程?
  • Asp.Net Web 服务和远程处理是已被 WCF 取代的遗留技术。如果您所说的 Web 服务是指 WCF 小心,它们就不是一回事了。
【解决方案3】:

我将通过 TCP 或 .NET 远程处理与定义要执行的任务所需的参数进行通信。

然后,您将需要一个类来管理此请求并与线程通信,告诉它们要做什么。

【讨论】:

  • .Net 远程处理已经过时了。基于 WCF 的服务更易于实施、配置和保护 IMO。
【解决方案4】:

我不会使用线程 ID。线程名称是可能的,但我倾向于为每个任务提供一个名称并键入它。

如果我要解决这个问题,我会在你的 Windows 服务上公开一个Window Communication Foundation (WCF) 接口。然后,您的应用程序将通过该接口控制任务。

我会避免使用 .NET Remoting。它会工作,但.NET Remoting has been superseded by WCF。来自 MSDN 文章:

WCF 取代了之前的几个 用于创建的 Microsoft 技术 分布式应用程序。最多 本来可以的应用程序 使用 ASP.NET Web 服务、.NET 构建 远程处理、企业服务、 System.Messaging 或 WSE 将改为 建立在 WCF 之上。

【讨论】:

  • 说到哪个(id/name),你认为有可能从它的名字中得到一个线程的实例吗?对了,我不会用id,不靠谱。
  • AFAIK,无法枚举托管线程列表。为此,您可能需要考虑将每个线程包装在您维护的对象中。见这里:stackoverflow.com/questions/1825882/…
猜你喜欢
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2012-11-09
  • 2013-11-14
  • 1970-01-01
相关资源
最近更新 更多