我有一个关于调用消费WCF服务的架构问题。
目前,我的WCF服务包含2个函数SubmitJob和ProcessQueueJobs
因此,我调用ProcessQueueJobs的最简单方法是获得服务合同,并通过简单的控制台应用程序进行扭曲,并计划每隔几分钟运行一次。我不太喜欢这个解决方案,因为我不想将ProcessQueueJob暴露给客户端。 那么在托管WCF服务的进程中运行ProcessQueueJobs的最佳方法是什么?
答案 0 :(得分:0)
我有一个WCF接口使用的控制器类(我有SOAP和REST接口)。
因此,当有人打电话给SubmitJob
时,我会将其传递给控制器。
在控制器功能中,它会将其保存到队列中。
现在,在我的项目中,我有一个在这个类中定义的队列:
public static class WebServiceControllerStatic
{
static ConcurrentQueue<WebServiceModels.Job> jobqueue = new ConcurrentQueue<WebServiceModels.Job>();
然后我有这两个方法,一个是将信息放入队列,另一个是启动线程来处理队列。
public static WebServiceModels.Job[] JobQueue
{
set
{
value.AsParallel().ForAll(i => jobqueue.Enqueue(i));
}
}
public static void ProcessUpdateJobQueue()
{
Action UpdateJob = () =>
{
if (jobqueue.IsEmpty)
return;
int cnt = 0;
Parallel.For(0, jobqueue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 20 },
(j) =>
{
cnt++;
});
};
if (processUpdateJobThread == null)
{
processUpdateJobThread = new System.Threading.Thread(() =>
{
while (true)
{
UpdateJob();
UpdateJob();
System.Threading.Thread.Sleep(10000);
}
});
processUpdateJobThread.Start();
}
}
在我的控制器方法中,我称之为,在您的情况下,只要进行一次SubmitJob调用:
WebServiceControllerStatic.JobQueue = jobs;
WebServiceControllerStatic.ProcessUpdateJobQueue();
因此,我有一个队列可以保存需要处理的内容,以及一个经常启动的线程来处理队列中的任何内容。
这适合我的需要。
我使用ConcurrentQueue主要是因为我会同时更新并从队列中删除。