Codes DeCodes Ответов: 5

Как установить таймер на 5 минут, чтобы сделать определенную операцию в приложении, и если тайм-ауты, поднять другое событие, чтобы сделать другую задачу


Я разрабатываю приложение для бронирования авиабилетов. Здесь пользователь выбирает рейс и входит в систему. После входа в систему ему должно быть предоставлено 5 мин времени для завершения бронирования, оплаты и подтверждения билета. Если его задача не будет выполнена в течение 5 минут, его бронирование будет аннулировано. Для отмены мне нужно запустить какое-то событие. Это событие не должно быть вызвано, если пользовательская операция завершена в течение 5 минут.

Каковы наилучшие методы для этого в MVC 5 и C#?

Что я уже пробовал:

Я нашел метод события таймера c# для выполнения этой задачи, но я все еще не уверен, следует ли мне использовать его или нет. Есть ли лучшее решение? Кроме того, не уверен, как я могу отменить бронирование после того, как интервал времени превышает 5 минут?

5 Ответов

Рейтинг:
20

Codes DeCodes

Я нашел этот код, и он работал именно так, как я хотел.

private static void OnTimedEvent(object source, ElapsedEventArgs e)
    { 
        //do something
    }

    protected void Button1_Click(object sender, EventArgs e)
    {

        if (Session["Timer"] == null)
        {
            Session["Timer"] = new System.Timers.Timer();
        }
        
        ((System.Timers.Timer)Session["Timer"]).Interval = 5000;
        ((System.Timers.Timer)Session["Timer"]).Elapsed += OnTimedEvent;
        ((System.Timers.Timer)Session["Timer"]).AutoReset = true;
        ((System.Timers.Timer)Session["Timer"]).Enabled = true; 
    }

    protected void Button3_Click(object sender, EventArgs e)
    {
        ((System.Timers.Timer)Session["Timer"]).Enabled = false;
    }


Рейтинг:
2

CPallini

Таймер в порядке, я полагаю.
Чтобы отменить бронирование, убедитесь, что за его полную фиксацию отвечает один метод. Таким образом, пока такой метод не был вызван, ваш код может отменить бронирование без необходимости выполнять обратные шаги.


Рейтинг:
1

Gerry Schmitz

Цитата:
Я нашел метод события таймера c# для выполнения этой задачи, но я все еще не уверен, следует ли мне использовать его или нет.


Используйте его ... учитывая, что никто другой не имеет понятия, что это за метод ... за исключением того, что он "выполняет свою задачу", что является почти 100% точкой.


Рейтинг:
1

Codes DeCodes

Это код, который я нашел в блоге msdn. Это лучшее, что я нашел для себя. Я буду использовать это::

using System;
using System.Timers;
namespace Timer
{
    public partial class Index : System.Web.UI.Page
    {
        private static System.Timers.Timer aTimer;

        protected void Page_Load(object sender, EventArgs e)
        {          

        }

        // Specify what you want to happen when the Elapsed event is raised.
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        { 

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            // Create a timer and set a two second interval.
            aTimer = new System.Timers.Timer();
            aTimer.Interval = 5000; //10 sec

            // Hook up the Elapsed event for the timer. 
            aTimer.Elapsed += OnTimedEvent;

            // Have the timer fire repeated events (true is the default)
            aTimer.AutoReset = true; //AutoReset = false raises ElapsedEventHandler only once

            // Start the timer
            aTimer.Enabled = true; 
        }

        protected void Button2_Click(object sender, EventArgs e)
        {

            for (int i=0; i<100000000; i++)
            {
                System.Threading.Thread.Sleep(1000);
            }
            //aTimer.Enabled = true;
        }

        protected void Button3_Click(object sender, EventArgs e)
        {
            aTimer.Enabled = false;
        }
    }
}


Afzaal Ahmad Zeeshan

Он хотел бы получить предложение для MVC 5, это для веб-форм.

Codes DeCodes

это не должно быть проблемой, потому что aTimer является глобальным, и экземпляр aTimer может быть доступен на разных этапах выполнения.

Richard Deeming

Из какого блога MSDN это было? Код просто ужасен! С помощью static переменная, у вас будет один таймер через каждого пользователя вашего сайта. Один пользователь, нажав на кнопку, сбросит таймер для каждый второй пользователь.

И не ожидайте, что сможете обновить какие-либо элементы управления на своей странице из обработчика событий таймера. Или любое состояние сеанса. Или что-нибудь еще, если уж на то пошло. К тому времени, когда он срабатывает, как страница, так и текущий HttpContext они уже давно ушли.

Codes DeCodes

Спасибо за информацию.
Итак, что вы предлагаете для поддержания таймера для одного пользователя (скорее всего, несколько пользователей могут войти в систему через другой браузер на одном компьютере).
Можно ли не использовать статику, как это?

частная система.Таймеры.Таймер aTimer;

Рейтинг:
0

Afzaal Ahmad Zeeshan

Таймер на самом деле является объектом (или типом) C#, который вы можете использовать в своих программах и приложениях C#, таких как WPF, WinForms и т. д. Но поскольку вы отметили MVC 5 этим вопросом и, скорее всего, хотите реализовать эту функцию в веб-приложении, лучшим подходом было бы управлять этим со стороны клиента.

В JavaScript вы можете сделать это,

/* 
 * bookingMade to be set to true if user has made a booking so timer 
 * can be ignored and user can continue, in case timer hits. 
 */
let bookingMade = false;
let minutes = 5 * 60 * 1000; // 5 minutes

setTimeout(function() {
    if(!bookingMade) {
        // Refresh the page and capture a new session
    }
    // else is not needed, as per your case.
}, minutes); // Attach the timeout
Таким образом, вы можете контролировать запросы со стороны клиента и отклонять любой запрос, который приходит через 5 минут. Конечно, это просто не укладывается у меня в голове прямо сейчас, и вы можете сделать работу лучше, чем я. Но в двух словах это тот путь, который вам нужно пройти, чтобы контролировать эту систему бронирования.

Смотрите здесь дополнительную информацию о том, как управлять этим таймером, WindowOrWorkerGlobalScope.setTimeout() - веб-API | MDN[^]

Серверная реализация сеанса также является хорошим подходом, так как ваш сервер сам отклонит любой запрос, который придет после истечения времени ожидания сеанса, но я опустил эту часть, поскольку сеансы обычно не следуют тайм—аутам—каждый раз, когда делается запрос, создается новый экземпляр и, таким образом, заставит вас создать статический экземпляр таймера и поддерживать его вместе с запросом или информацией о сеансе, что довольно уродливо, как я себе это представляю, - и вам, возможно, придется писать тайм-ауты сеанса самостоятельно, см. Тайм-аут сеанса в ASP.NET - переполнение стека[^]. Эта реализация на стороне сервера может контролировать большую часть того, что вам придется реализовать самостоятельно.