我有一个需要运行的服务来管理长时间运行的后台任务。我通过WCF托管这项服务,但我遇到了一个问题,即每次后续的Web请求都会不断创建和销毁服务。
这是服务:
[ServiceContract]
public interface IFileProcessService
{
[OperationContract]
[WebInvoke(UriTemplate = "ProcessFile?s={session}&file={fileName}", BodyStyle = WebMessageBodyStyle.Bare)]
int ProcessFile(int session, string fileName);
}
public class FileProcessService : IFileProcessService
{
private FileProcessTaskScheduler mTaskScheduler;
private TaskFactory mTaskFactory;
private FileProcessService()
{
mTaskScheduler = new FileProcessTaskScheduler(4);
mTaskFactory = new TaskFactory(mTaskScheduler);
}
public int ProcessFile(int scriptRunId, string fileName)
{
return mTaskFactory.StartNew(() =>
{
Console.WriteLine("Processing file {0} for script run {1}", fileName, scriptRunId);
Thread.Sleep(TimeSpan.FromMinutes(1));
Console.WriteLine("Completed processing file {0} for script run {1}", fileName, scriptRunId);
}).Id;
}
}
显然,当TaskScheduler和TaskFactory在每个请求结束时被处理掉时,它并没有真正起作用。
主要是我主持这样的服务:
WebServiceHost host = new WebServiceHost(typeof(FileProcessService), new Uri("http://localhost:7343/"));
ServiceDebugBehavior sdb = host.Description.Behaviors.Find<ServiceDebugBehavior>();
sdb.HttpHelpPageEnabled = false;
ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IFileProcessService), new WebHttpBinding(), "");
host.Open();
Console.WriteLine("Service is now running...");
Console.ReadKey();
host.Close();
Console.WriteLine("Service has stopped...");
我已经尝试将服务的成员设置为static,然后使用if检查将它们的实例化包装在构造函数中,但在那时我认为编写一个单独的单例类来处理这些东西会更简洁。
WCF WebServiceHost似乎将它作为单例托管的服务实例引用,但它肯定不会这样对待它。我是否需要采取一些额外的步骤来使WebServiceHost在每次请求后都不处理我的对象?