我正在开发一个WCF服务,它运行一些后台线程来将数据写入数据库。后台线程使用标准生产者& amp;消费模式:
private readonly Queue<DatabaseChange> ChangeQueue = new Queue<DatabaseChange>();
public Worker(int id)
{
var workerThread = new Thread(SynchronizationWorker)
{
IsBackground = true,
Name = "deltaQ-" + id,
Priority = ThreadPriority.Highest
};
workerThread.Start();
}
private void SynchronizationWorker()
{
while (true)
{
s_Logger.Info("waiting for changes...");
_changeAvailableEvent.WaitOne();
s_Logger.Info("changes available, start persisting...");
...
// actual work. not important because we never come here (as we can observe in the log file)
}
}
public void Enqueue(DatabaseChange change)
{
lock (ChangeQueue)
{
ChangeQueue.Enqueue(change);
}
_changeAvailableEvent.Set();
}
该服务以单实例模式运行。
现在我们观察到了:
工作线程开始运行,一切正常。
然后在某些时候,即使将数据添加到队列和事件集中,工作线程也不会再被唤醒了。
工作线程也具有最高优先级,因此即使服务器非常繁忙,他们也应该获得时间片。
此时我不知道该怎么做,似乎IIS主机进程在某些时候决定不再安排工作线程。
答案 0 :(得分:1)
这里的问题是IIS。 IIS工作进程可以在任何时间点关闭,原因是您无法控制。此外,工作流程在回收时可能会重叠。
在您的情况下,Windows服务将是更好的选择。
查看此帖子了解更多详情:WCF hosted in IIS vs in Windows Service