2014-09-05 6 views
1

Я разрабатываю программное обеспечение для сборщика данных, использующего Compact Framework.Таймер в CF не отмечает

Я делаю проверку для каждого метода, который я звоню, и я посчитаю время, которое этот метод принимает для выполнения. Если это время больше или равно 1 минуте, тогда я собираюсь выбросить исключение. У меня есть следующее:

public static TResult Call<TResult>(Func<TResult> closure) 
    { 
     int ellapsedSeconds = 0; 
     Timer timer = new Timer { Interval = 1000, Enabled = true }; 
     timer.Tick += delegate 
     { 
      ellapsedSeconds++; 
      if (ellapsedSeconds < 60) return; 
      timer.Enabled = false; 
      throw new Exception(@"TimeOut Error Again!"); 
     }; 

     try 
     { 
      TResult result = closure.Invoke(); 
      timer.Enabled = false; 
      return result; 
     } 
     catch (Exception) 
     { 
      timer.Enabled = false; 
      throw; 
     } 
    } 

Я знаю, что есть другие способы проверки, но я не хочу менять это. Я разместил свой проблемный домен, чтобы вы были внутри этого, но настоящая проблема заключается в том, что Timer не запускает события тика. Он не имеет метода расширения, называемого .Start() или .Stop(), как и для настольного приложения. И timer.Enabled = true; не начинает галочкой. Посмотрите в:

enter image description here

Как я могу запустить таймер с компактной структурой?

+0

Вы вообще блокируете нить пользовательского интерфейса? –

+1

Таймер является локальным для метода. Вероятно, это GC'd, прежде чем он подумал о тикании, –

+0

Это действительно локально для метода. Я не могу применять глобальный член, потому что это статический класс. –

ответ

3

Таймер полагается на насос сообщений Windows, который помещается в поток вызывающего абонента. Таким образом, вы не получите никаких событий TimerTick.

Попробуйте использовать метод BeginInvoke. Методика описана в этой статье - Calling Synchronous Methods Asynchronously.

2

Существует два таймера: один в System.Windows.Forms и один в System.Threading.Thread.

Таймер, основанный на формах, должен запускать насос сообщений, отправляя сообщения WM_TIMER, которые выдает обработчик события Tick. Обработчик Tick не будет вызываться, если графический интерфейс заблокирован и он не будет работать, когда устройство будет приостановлено. http://msdn.microsoft.com/en-us/library/system.windows.forms.timer_members%28v=vs.90%29.aspx Таймер формы не имеет метода Start() или Stop(), но запускается и останавливается при использовании Enabled = true и false.

Таймер на основе Thread использует поток и вызывает функцию обратного вызова, когда истекшее: http://msdn.microsoft.com/en-us/library/system.threading.timer%28v=vs.90%29.ASPX

Вы выбрали таймер Forms, который неправильно один для целей (проверить, если GUI или APP висит), так как это таймер не вызывается, если насос сообщения заблокирован. Вы должны переключиться на таймер Thread.

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

  • Нет связанных вопросов^_^