У меня есть служба WCF, размещенная в службе Windows (работает в локальной системе). Я запускаю System.Timer внутри него. Операция o1, которая инициализирует таймер, объявляется через конечную точку http через webHttpBinding. Я включил трассировку для System.ServiceModel и из файла .svcLog проверил продолжительность прослушивания для операции o1. Это показывает, что после работы в течение примерно 20 часов прослушивание в конечной точке http просто останавливается.
Я думаю, это связано с тем, что на эту конечную точку не поступило входящее сообщение. Проблема здесь в том, что прослушивание останавливается, мой таймер (который был инициализирован внутри этой конкретной операции o1) также останавливается!
Есть ли рекомендуемый способ поддерживать прослушиватель и, следовательно, таймер в течение длительного времени? Можем ли мы периодически пинговать операцию o1, чтобы держать ее в памяти?
Кроме того, моя переменная таймера, которую я инициализирую внутри операции o1, является переменной экземпляра, разве эта переменная не должна находиться в памяти (WCF является синглтоном), даже если прослушиватель закрывается??
Спасибо большое.
Выдержки из кода-
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class SchedulerWindows : ISchedulerWindows
{
///.........all instance variables.....
DataTimer timer = null; /**DataTimer wraps a System.Timers timer variable**/
public List<DataTimer> timersInService = new List<DataTimer>();
public ISchedulerWindows.o1(string s1, string s2, /*********/)
{
//..........//
timer = new DataTimer();
}
}
public class DataTimer
{
/****Newly introduced System.Threading.Timer, previously I was using System.Timers.Timer which was dying****/
public System.Threading.Timer thTimer;
private static readonly object dbAccessLock = new object();
private static readonly object thCallbackLock = new object();
public DataTimer()
{
}
public DataTimer(/************/)
{
TimerCallback timerDelegate = new TimerCallback(this.WorkMethod);
EventLogLogger l = new EventLogLogger();
//l.LogMessage("setting up timer ");
thTimer = new Timer(this.WorkMethod, null, 0, period);
}
...
}
РЕДАКТИРОВАТЬ: переход на пространство имен System.Threading из пространства имен System.Timers И увеличение временного интервала исправили это для меня. Переменная таймера больше не исчезает.