2012-06-26 1 views
1

Я совершенно новичок в 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.

Я попытался запустить это в течение нескольких часов, но в какой-то момент все мои попытки подошли к концу: поскольку мне нужно запустить и остановить таймер из разных методов, мне нужно объявить его вне метода. Проблема в том, что я могу объявлять только статические методы в качестве делегата. если метод статичен, я не могу изменить параметры, используемые методом делегирования таймеров.

Я знаю, что мой английский и объяснение не самые лучшие, но я надеюсь, что вы сможете получить мою точку зрения. Как я могу реализовать эту функциональность? Проблема в том, что я не должен изменять функцию, вызывающую мой класс.

ответ

0

Зачем вам ставить свой таймер? Вы не должны. Просто объявите его как обычную переменную в своем классе.

+0

Я не заявляю, что мой таймер статичен. Мне нужно дать ему статический математик в качестве функции его делегата. Вот мой код для таймера: «TempLoop TheTempLoop = новый TempLoop(); AutoResetEvent autoEvent = новый AutoResetEvent (false); TimerCallback tcb = TheTempLoop.DoLoop; Таймер TheLoopTimer = новый таймер (tcb, autoEvent, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); ' – Kevin

+0

Нет, вам не нужно« давать ему »делегата, указывающего на статический метод ? (Возможно, так или иначе, но если это так, это действительно, действительно, очень плохой код) – Onkelborg

+0

Поскольку мне нужно написать код вне метода (причина, по которой метод timer.change следует вызывать в Run() и Stop()) Мне нужно объявить таймер в голове класса (вне метода), и там я могу «дать ему» делегат статическому методу. – Kevin

Смежные вопросы