Я совершенно новичок в C# и программировании вообще. В настоящее время я больше появляться следующие проблемы и я надеюсь, что вы можете помочь me.I есть программа в настоящее время, глядя, как это:Perdiodic Событие в классе, не блокируя нить, таймер нитей
public class myClass
{
public void SetSomething(Parameter)
{
///Here something is set
}
private void DoSomething()
{
///Here something is done using paramaters from the SetSomething()
}
public void Run()
{
DoSomething(); //this needs to be done periodicly after started one time
}
public void Stop()
{
//Stop doing something periodically
}
}
От внешней функции (вход пользователя через форму) SetSomething, Run и Stop называются. DoSomething должен запускаться периодически, если вызывается Run() до вызова Stop(). Проблема в следующем: это не должно блокировать текущий поток. Таким образом, Sleep (x) не является вариантом. Параметры SetSomething меняются очень часто, поэтому вызов Stop() перед и другим Run() впоследствии не является параметром для изменения параметров DoSomething()
Скорее всего, Таймеры - идеальное решение здесь. Но поскольку эта программа используется в WinCE6 с инфраструктурой compact.Net, пространство имен System.Timers недоступно. Я пробовал использовать system.windows.forms.Timer, но это не будет запускать данное событие когда-либо (возможно, потому, что оно находится в неправильном потоке. Я не записывал форму и не должен ее изменять). Поэтому мой единственный вариант - System.threading.timer.
Я попытался запустить это в течение нескольких часов, но в какой-то момент все мои попытки подошли к концу: поскольку мне нужно запустить и остановить таймер из разных методов, мне нужно объявить его вне метода. Проблема в том, что я могу объявлять только статические методы в качестве делегата. если метод статичен, я не могу изменить параметры, используемые методом делегирования таймеров.
Я знаю, что мой английский и объяснение не самые лучшие, но я надеюсь, что вы сможете получить мою точку зрения. Как я могу реализовать эту функциональность? Проблема в том, что я не должен изменять функцию, вызывающую мой класс.
Я не заявляю, что мой таймер статичен. Мне нужно дать ему статический математик в качестве функции его делегата. Вот мой код для таймера: «TempLoop TheTempLoop = новый TempLoop(); AutoResetEvent autoEvent = новый AutoResetEvent (false); TimerCallback tcb = TheTempLoop.DoLoop; Таймер TheLoopTimer = новый таймер (tcb, autoEvent, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); ' – Kevin
Нет, вам не нужно« давать ему »делегата, указывающего на статический метод ? (Возможно, так или иначе, но если это так, это действительно, действительно, очень плохой код) – Onkelborg
Поскольку мне нужно написать код вне метода (причина, по которой метод timer.change следует вызывать в Run() и Stop()) Мне нужно объявить таймер в голове класса (вне метода), и там я могу «дать ему» делегат статическому методу. – Kevin