我想创建一个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()
。
每个请求只有一个活动进程。 将从ASP.NET Web应用程序访问GetStatus和StartProcess,并且可以由多个用户访问它。
我在调用WCF服务期间启动长时间运行的线程是否会导致任何问题? (响应将到达客户端,线程将继续运行?)
在这种情况下,我应该更好地使用单例实例吗?如果是,那么之前的问题是适用于这种情况吗?
答案 0 :(得分:1)
我认为您的服务合同设计合理( IF 您完全确定只会有一个长期运行的任务)。但我不会在实现该服务的类中执行长时间运行的任务。我会将它分解为另一个组件。
如果您有多个长时间运行的流程,则可以执行以下操作:
public interface IProcess
{
ProcessStatus GetStatus(Guid id);
Guid AsyncStartDataProcess();
}