【问题标题】:WCF and tasks with threadingWCF 和带线程的任务
【发布时间】:2023-11-16 06:05:02
【问题描述】:

我想使用 WCF 编写一些 Web 服务。

我想在我的网络服务中有一个“线程池”。 例如,我需要处理将近 6GB 的数据。

我希望客户端调用 Web 服务上的操作并创建一个新任务或线程。客户端能够调用 ListRunningTasks();并让网络服务返回一个任务列表。如果任务花费太长时间,客户端应该能够强制终止任务,例如KillTask​​(int taskID);或者其他的东西。我以前做过一些线程,但不是在 WCF 内部或没有状态的服务中。这可能吗?如果是这样,人们将如何实施这样的事情?任何阅读、链接或建议都会很棒。

谢谢,迈克。

【问题讨论】:

  • “我有将近 6GB 的数据需要处理。” - 这样的任务最多运行多长时间?

标签: web-services multithreading soa scheduled-tasks pool


【解决方案1】:

您应该考虑使用Windows Workflow Foundation 创建此类服务。状态机工作流可以公开为服务,当调用方法 A 时,它将启动工作流(任务),之后可以调用方法来停止、暂停或查询正在运行的任务。 WF 将处理状态转换,防止非法状态更改,并确保仅在必要时启动新任务。

请注意,WF 将以几乎透明的方式为您处理线程问题。

【讨论】:

    【解决方案2】:

    一种可能的解决方案:

    • 考虑到它们需要很长时间(如您所写的那样,20-30 分钟),为您的未完成任务实施显式队列。

    • 构建一个自定义组件来管理这些队列,例如你甚至可能想要持久化它们的能力,在你重启服务时恢复工作等等。

    • 已明确创建从这些队列中提取工作的工作线程。

    • 实施 WCF 服务以使您的队列管理器可用于外部系统。

    线程池更适合处理大量的短期任务。

    【讨论】:

    • 正如约翰所写,这可以通过世界自然基金会来完成。但是,根据您的任务,WWF 可能有点矫枉过正。
    • 我不知道该怎么做的主要事情是处理状态。 WCF 是无状态的。什么是显式队列?那是.Net的东西吗?我找不到任何关于它的东西。这个队列怎么会有状态?感谢您的回答亚历克斯
    • “什么是显式队列” - 只是一个存储未完成任务的对象。明确的意思是您自己创建一个管理该队列。 WCF 是无状态的,但这并不意味着您的整个过程必须是无状态的。