Windows サービス (ローカル システムで実行) でホストされている WCF サービスがあります。その中で System.Timer を実行しています。Timer を初期化するOperation o1は、webHttpBinding を介して http エンドポイントで宣言されます。System.ServiceModel のトレースを有効にし、.svcLog ファイルから操作 o1 のリッスン期間を確認しました。約 20 時間実行した後、http エンドポイントでのリッスンが停止したことを示しています。
これは、着信メッセージがそのエンドポイントに到着しなかったためだと思います。ここでの問題は、リスニングが停止することであり、タイマー (その特定の操作o1内で初期化されたもの) も停止します!
リスナー、つまりタイマーを長時間維持するための推奨される方法はありますか? o1 操作を定期的に ping してメモリに保持できますか?
また、オペレーション 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.Timers名前空間からSystem.Threading名前空間に変更し、時間間隔を長くすると、修正されました。タイマー変数はもう消えません。