WCF进程内部的AutoResetEvent有时不会唤醒线程

时间:2016-10-12 08:27:50

标签: c# multithreading wcf synchronization

我正在开发一个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主机进程在某些时候决定不再安排工作线程。

1 个答案:

答案 0 :(得分:1)

这里的问题是IIS。 IIS工作进程可以在任何时间点关闭,原因是您无法控制。此外,工作流程在回收时可能会重叠。

在您的情况下,Windows服务将是更好的选择。

查看此帖子了解更多详情:WCF hosted in IIS vs in Windows Service