【发布时间】:2017-02-20 23:29:04
【问题描述】:
我正在开发一个运行一些后台线程以将数据写入数据库的 WCF 服务。后台线程使用标准的生产者和消费者模式实现:
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 主机进程在某个时候决定不再调度工作线程。
【问题讨论】:
标签: c# multithreading wcf synchronization