2013-07-05 3 views
0

В моем следующем коде событие Timer_Elapsed не попадает.Task.Factory.StartNew() не запускает событие ElapsedEventHandler

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Threading; 
using System.IO; 
using System.Reflection; 
using System.Diagnostics; 

namespace Logger 
{ 
    internal class Country 
    {  
     public string CountryName { get; set; } 
     public string CountryCode { get; set; } 
    } 
    internal class CountryLogger 
    { 
     List<Country> countries = new List<Country>() 
     { 
      new Country{CountryName = "India", CountryCode="IND"}, 
      new Country{CountryName = "United States of America", CountryCode="USA"}, 
      new Country{CountryName = "United Kingdom", CountryCode="UK"}, 
      new Country{CountryName = "Australia", CountryCode="AUS"} 
     }; 
     public void WriteToLog() 
     { 
      string fileName = @"C:\ParallelLog.txt"; 
      using (StreamWriter writer = new StreamWriter(fileName, true)) 
      { 
       foreach (Country Country in countries.AsParallel().AsOrdered()) 
       { 
        writer.WriteLine("{0} - {1}", Country.CountryName, Country.Count ryCode); 
        writer.WriteLine(); 
       }     
      } 
     } 
    } 
    internal class Program 
    { 
     static void Main(string[] args) 
     { 
      System.Timers.Timer timer = new System.Timers.Timer(); 
      timer.Enabled = true; 
      timer.Interval = 3 * 60 * 1000; 
      timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);          
     } 
     static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      //for (int i = 0; i < 10; i++) 
      //{ 
      Task task = Task.Factory.StartNew(() => 
      { 
       CountryLogger countriesLogger = new CountryLogger(); 
       countriesLogger.WriteToLog(); 
      }); 
      //} 
     } 
    }  
} 

Также задача Task = Task.Factory.StartNew (() => объект не зацикливание через цикл (КОММЕНТИРОВАННЫЙ, потому что это не работает).

Может кто-то предполагает, лучший способ написания этого кода на работу ?!

+0

Выходы 'Main', концы программы, таймеры снесены. –

ответ

1

Что следует первая программа нить делать в то время позволяя запустить таймер

Здесь, я просто жду пользователя попасть возвращение:

static void Main(string[] args) 
    { 
     System.Timers.Timer timer = new System.Timers.Timer(); 
     timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed); 
     timer.Interval = 3 * 60 * 1000; 
     timer.Enabled = true; 
     Console.WriteLine("Press return to exit"); 
     Console.ReadLine(); 
     GC.KeepAlive(timer); //Can't decide if this is needed or not 
    } 

Что является важным является то, что если вы return от Main (или просто удар окончательного }), ваша программа будет выходить. Я не помню, сохраняются ли таймеры в плане коллекции мусора, поэтому я на всякий случай добавил GC.KeepAlive.


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

+0

Спасибо Damien! Итак, как насчет сценария Windows Service? Я собираюсь реализовать Timer в моей службе Windows OnStart(). Я не смогу разместить Console.ReadLine(). Пожалуйста, предложите! –

+0

@SriramB - в сервисе вам, как правило, нужно иметь хотя бы один нефонический поток - вы можете просто запустить новый поток, который просто «Подождите' на «ManualResetEvent», который вы «установите» в своем 'OnStop 'method - если или пока вы не найдете какую-нибудь полезную работу для этого потока. –

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