【问题标题】:How do design a WCF service that can start a Task asynchronous and Gets it status如何设计可以异步启动任务并获取其状态的 WCF 服务
【发布时间】:2012-01-24 22:53:31
【问题描述】:

我想创建一个 WCF 服务,该服务将启动一个长时间运行的任务并可以查询线程的状态。

我的想法是创建一个实现这个接口的类

public interface IProcess
{
    ProcessStatus GetStatus();
    void AsyncStartDataProcess();
}

AsyncStartDataProcess 将创建一个新线程,该线程将为一些长时间运行的任务运行方法。

然后在 WCF 服务中有一个 IProcess 类型的静态对象:

public static IProcess ActiveProcess = ProcessFactory.CreateNewProcess();

然后通过ServiceContract暴露两个方法:

StatusResponse GetStatus();
StartProcessResponse StartProcess();

StartProcess 方法将调用 ActiveProcess.AsyncStartDataProcess()GetStatus 将调用 ActiveProcess.GetStatus()

每个请求只有一个活动进程。 GetStatus 和 StartProcess 将从 ASP.NET Web 应用程序访问,并且可以由多个用户访问。

在调用 WCF 服务期间我启动了一个长时间运行的线程是否会导致任何问题? (响应将到达客户端,线程将继续运行?)

在这种情况下我应该更好地使用单例实例吗?如果是,上一个问题是否适用于这种情况?

【问题讨论】:

  • 如果你要使用单例,它会存在于哪个线程中?无论如何,您将不得不开始一个新线程。只需确保当 2 个用户同时调用 StartProcess() 时无法启动 2 个线程。
  • 最初的想法是为长时间运行的任务创建一个新线程,无论服务类型如何。感谢您的输入,我在启动线程之前放了一个锁。我做了一些基本的测试,效果很好。

标签: .net wcf architecture


【解决方案1】:

我认为你的服务合同设计得很好(如果你完全确定只有一个长期运行的任务)。但我不会在实现服务的类中执行长时间运行的任务。我会将其分解到另一个组件中。

如果您有多个长时间运行的进程,您可以这样做:

public interface IProcess
{
    ProcessStatus GetStatus(Guid id);     
    Guid AsyncStartDataProcess();
}

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 2020-01-27
    • 2019-12-20
    • 2011-05-04
    • 1970-01-01
    • 2013-04-08
    • 2015-05-22
    • 1970-01-01
    • 2014-09-17
    相关资源
    最近更新 更多