ASP.NETと ERP システムである Microsoft Dynamics AX 4.0 に基づく電子商取引システムを開発しました。
HTTP セッションごとに、.NET コンポーネントである「ビジネス コネクタ」を使用して ERP システムにログオンします。「ビジネス コネクタ」オブジェクトは、セッション変数に保存されます。したがって、通常のSession_endで、Dynamics AX からログアウトし、すべてのリソースをクリーンアップします。
ERP システムは 32 ビット ベースのシステムであり、リソースを節約するために、一定時間非アクティブになった後に ERP システムからログアウトするタイマーを開発したいと考えています。2分としましょう。HTTP セッションのタイムアウトは 20 分に設定されています。
System.Timers.Timer
ユーザーがERPシステムに関連するもの(アイテム、バスケットなど)をクリックするたびにタイマーを開始および再起動する、を使用するクラス「TimerHandler」を作成しました。
コード例:
public class ErpHandler
{
private ErpTimerHandler TimerHandler
{
get
{
if (HttpContext.Current != null)
{
if (HttpContext.Current.Session["TimerHandler"] != null)
{
return (ErpTimerHandler)HttpContext.Current.Session["TimerHandler"];
}
}
return null;
}
set
{
if (HttpContext.Current != null)
{
HttpContext.Current.Session["TimerHandler"] = value;
}
}
}
private void StartTimer()
{
ErpTimerHandler timer = TimerHandler;
if timer == null)
{
timer = TimerHandler.Instance();
timer.TimerEvent += OnTimedEvent;
TimerHandler = timer;
}
timer.StartTimer();
}
private void StopTimer()
{
ErpTimerHandler timer = TimerHandler;
if (timer != null)
{
timer.StopTimer();
TimerHandler = null;
}
}
private void OnTimedEvent(Object source, EventArgs e)
{
StopTimer();
ErpLogOff();
}
public void ErpLogOff()
{
ErpSystem erp = ErpInstance;
if (LoggedOnErp && erp != null)
{
erp.Logoff();
ErpInstance = null;
}
LoggedOnErp = false;
}
}
このコードは nullOnTimedEvent
であるため、Erp on からログオフすることはありません。HttpContext.Current.Session
私が理解していることから、タイマーは別のスレッドで実行されているため、必要なときに現在のセッションを利用できません。
では、どうすればそのスレッドに「到達」できますか? または、タイマーがセッションと同じスレッドで実行されていることを確認できますか?