→ חזרה לעמוד הקודם
// סיכום וחומר לימוד

ניתוק המשתמש עקב חוסר פעילות

פרויקט הנדסת תוכנהבונוסים ותוספות לפרויקט

הוספת מחלקה סטטית

נוסיף מחלקה סטטית בשם SessionManager (כמובן ניתן לבחור שם שונה):

public static class SessionManager
{
    private static DispatcherTimer _timer;
    public static event Action OnTimeout; // אירוע שמופעל כשהזמן נגמר

    public static void Initialize(int minutes)
    {
        _timer = new DispatcherTimer();
        _timer.Interval = TimeSpan.FromMinutes(minutes);
        _timer.Tick += (s, e) => OnTimeout?.Invoke();
    }

    public static void Start() => _timer?.Start();
    public static void Stop() => _timer?.Stop();

    public static void Reset()
    {
        _timer?.Stop();
        _timer?.Start();
    }
}

אתחול ב־App.xaml.cs

בקובץ App.xaml.cs:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    // 1. אתחול הטיימר (למשל ל־5 דקות)
    SessionManager.Initialize(5);
    SessionManager.OnTimeout += App_OnTimeout;

    // 2. האזנה גלובלית לכל תנועת עכבר או לחיצת מקלדת באפליקציה
    EventManager.RegisterClassHandler(typeof(Window), Window.PreviewMouseMoveEvent,
        new MouseEventHandler(ResetInactivity));
    EventManager.RegisterClassHandler(typeof(Window), Window.PreviewKeyDownEvent,
        new KeyEventHandler(ResetInactivity));
}

private void ResetInactivity(object sender, EventArgs e)
{
    SessionManager.Reset();
}

טיפול בסיום הזמן

MainWindow הוא החלון שאליו יועבר המשתמש:

private void App_OnTimeout()
{
    SessionManager.Stop(); // עצירת הטיימר כדי שלא יקפוץ שוב ושוב

    // פתיחת חלון לוגין
    var loginWindow = new MainWindow();
    loginWindow.Show();

    // סגירת כל שאר החלונות הפתוחים (כולל ה־MainWindow)
    foreach (Window win in Application.Current.Windows)
    {
        if (win != loginWindow)
        {
            win.Close();
        }
    }

    MessageBox.Show("עקב חוסר פעילות, המערכת תועבר למסך ההתחברות.");
}

הפעלת הטיימר לאחר כניסת המשתמש

נפעיל את הטיימר רק בעת כניסת המשתמש - התחברות / הרשמה. לדוגמה:

private async void Login_Click(object sender, RoutedEventArgs e)
{
    string mail = txtMail.Text;
    string password = txtPassword.Password;

    if (await UserAPIService.SignIn(mail, password) == true)
    {
        SessionManager.Start(); // התחלת הספירה רק עכשיו
        this.NavigationService.Navigate(new Introduction());
    }
    else
    {
        MessageBox.Show("ההתחברות נכשלה");
    }
}
הורדת הקובץ המקוריPDF · ניתוק המשתמש עקב חוסר פעילות