【发布时间】:2012-01-20 19:09:29
【问题描述】:
客户端应用程序在服务器上启动一个进程(通过 RIA,但实现并不重要)。当我说进程时,我是指正在运行的业务代码,而不是指在 CPU 上运行的实际进程。
代码是 C#。
然后客户端检查进程状态。失败,已完成,仍在运行。
基础相对容易实现。我在服务器上静态存储了一个进程 ID,客户端可以在其中定期轮询服务器以检查将检查与进程 ID 关联的状态的进程。
围绕这个的边缘情况需要更多的工作。在不允许代码处理异常并优雅地将与进程关联的状态设置为失败的情况下异常中止线程(进程)的致命和灾难性原因。在这种情况下,客户端将继续假设该过程仍在进行中。
我正在考虑在单独的线程中运行该进程并跟踪线程 ID。当客户端调用服务器检查进程状态时,我们可以检查运行进程的线程的 IsAlive 属性。
我想知道是否有任何可能出现问题的情况?尽管线程被挂起,但 IsAlive 可能会返回 True。
另一种方法是让服务器上的进程定期设置时间戳,客户端检查状态时可以使用该时间戳。检查状态的代码可以查看时间戳的年龄,然后根据我们选择的任何时间间隔(比如说 2 分钟),它可以决定进程是否仍在运行(自上次写入时间戳以来还没有经过 2 分钟),或者进程无异常超时(自线程写入最后一个时间戳以来已超过 2 分钟)。所有时间戳都将在内存中完成。
在这方面是否有任何可能有益的最佳实践?有没有人对如何最好地解决这个问题有任何特别的见解或提示?我也对人们的其他场景或想法持开放态度?
【问题讨论】:
-
另外,请注意,这通常是一个长时间运行的操作,包含许多代码步骤。服务器进程可能需要一个小时或更长时间才能完成。
-
您可以与消息系统Keep Alive 术语并行,因此每个正在运行的业务流程 (BP) 都知道发送指示其运行状态的 KeepAlive 消息。为了避免高网络负载,您可以将 KA 消息发送到将收集统计信息的本地侦听器,只要侦听器是一个单独的进程,您提供的带有时间戳的场景应该可以很好地工作,但是您应该考虑如何覆盖侦听器挂起的情况。
标签: c# multithreading thread-state