[c#] Timer

markmsk

Сделал такой таймер

public void TryingToConnect
{
Terminal.TimerExampleState s = new Terminal.TimerExampleState;
TimerCallback timerDelegate = new TimerCallback(CheckStatus);
Timer timer = new Timer(timerDelegate, s,6000, 6000);
s.tmr = timer;
while(s.tmr != null)
Thread.Sleep(0);
}
public void CheckStatus(Object state)
{
Terminal.TimerExampleState s =(Terminal.TimerExampleState)state;
s.counter++;
this.talker.Start;

if(s.counter == 60)
{
(s.tmr).Change(3600000,100);
//Console.WriteLine("changed...");
}

}

Вопрос такой как-то странно себя ведёт этот таймер. Через некоторое время начинает без задержки вызывать функцию.
Функция которая вызывается вызывает соединение с сервером через сокет.

bleyman

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

markmsk

Хм вот я тоже так подумал.
Нить как то закрывать?

markmsk

Может здесь что-то сделать что бы приостановить, а затем вызвать функцию внутри нити снова
ThreadPool.QueueUserWorkItem(new WaitCallback(EstablishSocket;

FRider

Нити, которые порождаются потоковым таймером, берутся из Тредпула. Их завершать самому категорически не рекомендуется. Приостанавливать, имхо, тоже - основное назначение тредпуловых потоков - выполнить некую операцию и вернутся в пул как можно быстрее.
Честно говоря, вэтих твоих примерах очень много использользований нитей. Например, в конкретном коде каждый тик таймера - новая нить, как сказано было выше. Есть маза как можно реже создавать нити, только по необходимости, ибо каждая нить - это не только мегабайт в стеке, но и неебовые проблемы с синхронизацией.
Варианты деланья что-либо по таймеру:
1. Сделать отдельный тред, причем не из тредпула, а руками -
Thread timerThread = new Thread(new ThreadStart(timerMethod;
void timerMethod
{
while(true)
{
Thread.Sleep(timerInterval);
DoSomeWork;
}
}
В этом случае все вызовы DoSomeWork упорядоченны в времени, да и тред твой и управляется относительно легко...
2. Заботать класс System.Timers.Timer, в мсдне сказано, что это типо серверный таймер....
Больше ничего не знаю, ибо не юзал.

markmsk

Спасибо сейчас буду пробывать.
Оставить комментарий
Имя или ник:
Комментарий: