Таймер обратного отсчета на стороне сервера в asp. net c# - PullRequest
0 голосов
/ 19 июня 2020
• 1000 отлично, но время между 25-30 сек c пропускается.

Вот мой код

в файле .aspx

  <asp:UpdatePanel ID="upTimerAuction" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <div class="squareBOX">
                       <asp:Timer ID="tm1000ms" runat="server" Interval="1000" OnTick="tm1000ms_Tick"></asp:Timer>
                        <asp:Label ID="lblTimer" runat="server" EnableViewState="true"></asp:Label>
                    </div>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="tm1000ms" EventName="Tick" />
                </Triggers>
     </asp:UpdatePanel> 

в файле .aspx.cs

в page_load

  if (!Page.IsPostBack)
    {
            if (Application["AuctionTimer"] == null) 
            {
                Application.Lock();
                Application["AuctionTimer"] = new CountDownTimer(TimeSpan.Parse("00:00:30"));
                Application.UnLock();
                (Application["AuctionTimer"] as CountDownTimer).Start();
            }

        }
    }

В методе таймера

  protected void tm1000ms_Tick(object sender, EventArgs e)
{ 
     if (Application["AuctionTimer"] != null)
        {
            if (!(Application["AuctionTimer"] as CountDownTimer).TimeLeft.ToString().Equals("00:00:00"))
            {
                string rawTime = "";
                string AuctionTime = "";

                rawTime = (Application["AuctionTimer"] as CountDownTimer).TimeLeft.ToString();

                AuctionTime = rawTime.Substring(rawTime.IndexOf(":") + 1);

                int timerSec = Convert.ToInt32(AuctionTime.Substring(AuctionTime.IndexOf(":") + 1));

                lblTimer.ForeColor = Color.Black;
                lblTimer.Text = AuctionTime + "sec";
            }
            else
            {
                 if (Session["AdminID"] != null)
                {
                   //Database related classes are called to sold the item
                   // as it is an Auction Website (Live Auction)
                }

                startNewPlayerLoading();
            }
        }
}

метод startNewPlayerLoading

  private void startNewPlayerLoading()
{
    tm1000ms.Enabled = false; // disabling the timer of countdown
    divitemCard.Visible = false; // disabling the item picture div
    divnewitemCard.Visible = true; // enabling  the New Item Loading DIV
    upPlayerCard.Update(); // Updating update panel as they both are in same Update Panel
    timerblock.Visible = false;  // disabling old countdown timer
    freshTimerBlock.Visible = true;  // enabling new Loading countdown timer
    upFreshAuction.Update(); // Updating update panel as they both are in same Update Panel
    tmPlayerCard.Enabled = true; // enabling  the new Loading timer of countdown
    RestartFreshStopwatch(); // starting the Loading countdown Timer
}

и класс таймера обратного отсчета

  public class CountDownTimer
{
    public TimeSpan TimeLeft;
    System.Threading.Thread thread;

    public CountDownTimer() { }

    public CountDownTimer(TimeSpan original)
    {
        this.TimeLeft = original;
    }

    public void Start()
    {
        thread = new System.Threading.Thread(() =>
        {
            while (true)
            {
                if (!TimeLeft.Equals(TimeSpan.Parse("00:00:00")))
                {
                    System.Threading.Thread.Sleep(1000);
                    TimeLeft = TimeLeft.Subtract(TimeSpan.Parse("00:00:01"));
                }
            }
        });
        this.thread.Start();
    }

    public void Stop()
    {
        TimeLeft = TimeLeft.Add(TimeSpan.Parse("00:00:00"));
        if (this.thread != null)
            this.thread.Abort();
    }
}

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

Спасибо

...