У меня есть служба WCF, размещенная в службе Windows (работает в локальной системе).Я использую System.Timer внутри.Операция o1 , которая инициализирует таймер, объявляется через конечную точку http через webHttpBinding.Я включил трассировку для System.ServiceModel и из файла .svcLog проверил продолжительность прослушивания для операции o1.Это показывает, что после работы в течение примерно 20 часов прослушивание в конечной точке http просто прекращается.
Я думаю, что это связано с тем, что в эту конечную точку не поступило входящее сообщение.Проблема здесь в том, что когда прослушивание останавливается, мой таймер (который был инициализирован внутри этой конкретной операции o1 ) также останавливается!
Есть ли рекомендуемый способ сохранить слушателя, иотсюда таймер, на длительное время?Можем ли мы периодически пинговать Операцию o1, чтобы сохранить ее в памяти?
Кроме того, моя переменная таймера, которую я инициализирую внутри Операции o1, является переменной экземпляра, разве эта переменная не должна находиться в памяти (WCF являетсяSingleton), даже если слушатель закрывается ??
Большое спасибо.
Код Exceprts-
[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.Timers И увеличение временного интервала исправили это для меня.Переменная таймера больше не исчезает.