ASP. NET Таймер не работает. Как вызывать функцию каждые X секунд? - PullRequest
0 голосов
/ 01 апреля 2020

Я создаю страницу в ASP. NET Framework, и мне нужно обновлять текст в Label каждые X секунд. Я пытался создать новый Thread и вызвать Thread.Sleep(), но он не работает, Все, что написано ниже Thread.Sleep не выполняется, я не знаю, почему. Так я нашел на inte rnet Таймер. Я создал таймер, и он не вызывает метод. Если я пишу это статически в .aspx, это работает:

 <asp:ScriptManager ID="ScriptManager1" runat="server" />
     <asp:Timer runat="server" id="UpdateTimer" interval="5000" ontick="UpdateTimer_Tick" />
    <asp:UpdatePanel runat="server" id="TimedPanel" updatemode="Conditional">
        <Triggers>
            <asp:AsyncPostBackTrigger controlid="UpdateTimer" eventname="Tick" />
        </Triggers>
        <ContentTemplate>
            <asp:Label runat="server" id="DateStampLabel" />
        </ContentTemplate>
    </asp:UpdatePanel>
  protected void UpdateTimer_Tick(object sender, EventArgs e)
    {
        DateStampLabel.Text = DateTime.Now.ToString();
    }

Это работает, но я хочу изменить время, поэтому я создал его динамически в C#:

  if (!IsPostBack)
        {
            Timer timer = new Timer();
            timer.Tick += UpdateTimer_Tick;
            timer.Interval = 2000;
            timer.Enabled = true;
        }

Но UpdateTimer никогда не звонил. Поэтому я попробовал это, и оно все еще не работает:

 protected override void OnInit(EventArgs e)
    {
        if (!IsPostBack)
        {
            Timer timeoutTimer = new Timer();
            timeoutTimer.ID = "timeouttimer";
            timeoutTimer.Interval = 10000;
            timeoutTimer.Tick += new EventHandler<EventArgs>(UpdarteTimer_Tick);


            UpdatePanel timerUpdatePanel = new UpdatePanel();
            timerUpdatePanel.ContentTemplateContainer.Controls.Add(timeoutTimer);


            ScriptManager.GetCurrent(this.Page).RegisterAsyncPostBackControl(timeoutTimer);


            this.Page.Form.Controls.Add(timerUpdatePanel);
        }


        base.OnInit(e);
    }

Мне действительно нужно это на моем сайте. Пожалуйста, помогите мне. Как я могу создать некоторую процедуру в ASP. NET? Почему я не могу использовать Thread.Sleep на сайте и почему мой таймер не работает? Спасибо

Ответы [ 3 ]

0 голосов
/ 01 апреля 2020

Если вы просто хотите обновить интервал таймера на странице ... вы можете просто сослаться на уже созданный интервал и установить Интервал в Page_Init или Page_Load, как это ...

       <asp:ScriptManager ID="ScriptManager1" runat="server" />
     <asp:Timer runat="server" id="UpdateTimer" interval="5000" ontick="UpdateTimer_Tick"  />
    <asp:UpdatePanel runat="server" id="TimedPanel" updatemode="Conditional">
        <Triggers>
            <asp:AsyncPostBackTrigger controlid="UpdateTimer" eventname="Tick" />
        </Triggers>
        <ContentTemplate>
            <asp:Label runat="server" id="DateStampLabel" />
        </ContentTemplate>
    </asp:UpdatePanel>

 protected void Page_Load(object sender, EventArgs e)
 {
     if (!IsPostBack)
        {
            UpdateTimer.Interval = 2000;
        }
 }

0 голосов
/ 02 апреля 2020

Если все в порядке, вы можете использовать js код

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<script type="text/javascript">

    $(document).ready(function () {
        setInterval(function () {
            WebForm_GetElementById("MainContent_Label1").textContent = new Date().toLocaleString();
        }, 1000);
    });

</script>

Обратите внимание, что идентификатор ярлыка и имя элемента, который вы ищете, разные! (Честно говоря, я не знаю, почему ASP. NET меняет этот идентификатор)

0 голосов
/ 01 апреля 2020

После установки свойств таймера вы должны вызвать эту строку, чтобы запустить таймер:

timer.Start();

UPD: Я проверил ваш таймер пользовательского интерфейса, и он работает, но каждый раз при перезагрузке страницы происходит событие тика.

<asp:Timer ID="Timer1" runat="server" OnTick="Timer1_Tick"></asp:Timer>

и в коде файла:

    protected void Page_Load(object sender, EventArgs e)
    {
        Timer1.Interval = 1000;
    }

    protected void Timer1_Tick(object sender, EventArgs e)
    {
        Label1.Text = DateTime.Now.ToString();
    }

Таким образом, я рекомендую использовать метод js, о котором я упоминал в другом ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...