Member 14183203 Ответов: 1

Я пытаюсь показать счетчик в метке, основанной на времени, используя timespan


I am trying to show the count in a label based on the time using timespan

public partial class _Default : System.Web.UI.Page
{
    public int j;
    public int offers = 6000;
    public int i;
    protected void Page_Load(object sender, EventArgs e)
    {         
           SetInterval(() => calculate(), TimeSpan.FromSeconds(10));        
    }
    public void calculate()
    {
        DateTime time = DateTime.Now;
        int hour = time.Hour;
        int minute = time.Minute;
        int second = time.Second;
        int numdays = 90;        
        int num = Check_Prime(minute);
        int numofperday = offers / numdays;
        if (minute % 2 == 0)
        {
            j = j + 2;
            i = numoffers - j;
        }
        else
        {
            if (num == 1)
            {
                j = j + 3;
                i = numoffers - j;
            }
            else
            {
                j = j + 5;
                i = numoffers - j;
            }
        }
        if (j >=6000)
        {
            Thread.Sleep(TimeSpan.FromSeconds(100000));
        }
        Label2.Text = i.ToString();
    }
    public  async Task SetInterval(Action action, TimeSpan timeout)
    {        
        await Task.Delay(timeout).ConfigureAwait(false);        
        action();
        SetInterval(action, timeout);        
    }
   

}


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

Я пытаюсь показать счетчик в метке, основанной на времени, используя timespan
но метка всегда нулевая
пока я отлаживаю код там отображается значение count в метке но не в браузере

1 Ответов

Рейтинг:
2

OriginalGriff

Хм.
Вы понимаете, что делает этот код?

Вы собираетесь взорвать свой стек - вероятно, очень быстро, учитывая, что это веб-сайт, а стеки обычно меньше, чем у настольных приложений.
Неограниченная рекурсия никогда не бывает хорошей идеей ... а поскольку ваша страница никогда не отправляется в браузер до тех пор, пока страница не будет полностью загружена, вы не получите значение до тех пор, пока ваше событие загрузки не закончится. А это не так, потому что он застрял в рекурсивном цикле до тех пор, пока не взорвется стек или не закончится время сеанса.

Такие таймеры лучше всего реализуются на клиенте в javascript. Выполнение их на сервере-это захват ресурсов, которые явно ограничены и замедлят всех пользователей.


Richard Deeming

Ну, технически, так как SetInterval метод-это async метод, который awaitС а Task который не завершается синхронно, он не собирается взрывать стек.

Он не будет делать то, что хочет OP, и в конечном итоге съест всю память сервера; но он не взорвет стек. :)