2013-02-22 5 views
2

У меня есть поток в моей программе, которая запускает функцию таймера, напримерПочему C# поток перестает работать автоматически

Thread PopMonitoringThread = new Thread(new ThreadStart(PopMonitoring)); 
PopMonitoringThread.Start(); 

public static void PopMonitoring() 
{ 
    TimerCallback callback = new TimerCallback(Tick); 
    Timer stateTimer = new Timer(callback, null, 0, 1000); 
} 

//Timer method 
static public void Tick(Object stateInfo) 
{ 
    try 
    { 
     if (Properties.Settings.Default.BatchingMode > 0) 
     { 
      if (batchTime.Subtract(DateTime.Now) < TimeSpan.Zero) 
      { 
       batchTime = DateTime.Now.AddMinutes(Properties.Settings.Default.BatchingMode); 
       Console.WriteLine("-----------------------------------------------------"); 
       Process(); 
       Console.WriteLine("Batch Process Run"); 
       Console.WriteLine("-----------------------------------------------------"); 
      } 
      Console.WriteLine("{0}", DateTime.Now.ToString("h:mm:ss")); 
     } 
     Console.WriteLine("Pop3 Monitoring start after: {0}", batchTime.Subtract(DateTime.Now)); 
    } 
    catch (Exception e) 
    { 
     throw e; 
    } 
} 

Когда я комментирую мой процесс() метод работает отлично каждый второй мой таймер Интерактивным работает но когда я раскомментирую метод процесса из моего метода меток Tick, перестает работать, т. е. метод Tick перестает работать. Код метода обработки работает отлично, значит, нет компиляции и ошибок времени выполнения.

+0

Что вы делаете в «Процессе»? – RoadBump

+0

Мой метод обработки прочитал почту из pop3 gmail, затем отфильтруйте и отправьте httpwebrequest в мое приложение mvc3. – Raj

+2

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

ответ

3

Тема, которую вы создаете, останавливается почти мгновенно, независимо от того, звоните ли вы Process(). Все, что вы делаете в потоке, запускает таймер. фактический метод Tick выполняется в фоновом потоке из Thread Pool.

Теперь, в какой-то момент ваш сборщик мусора будет собран, потому что он выпал из сферы действия. В этот момент таймер больше не будет запущен. Скорее всего, эта сборка мусора происходит гораздо раньше, когда вы звоните Process()

Вы можете проверить это, позвонив по номеру GC.Collect() в свой Tick метод. Вы увидите, что он останавливается после одного или двух тиков.

Чтобы исправить это, сделайте stateTimer переменную-член. Потерять Thread материал:

class Program 
{ 
    private static Timer _stateTimer; 

    static void Main(string[] args) 
    { 
     _stateTimer = new Timer(Tick, null, 0, 1000); 
     Console.ReadLine(); 
    } 

    static public void Tick(Object stateInfo) 
    { 
     // ... 
    } 
} 

PS: Я полагаю, что этот код, потому что вы были экспериментировать, но если вы хотите повторно выдать исключение, вы поймали, вы должны использовать throw; без каких-либо параметров: см this Blog article для краткое объяснение.

+0

Gr8 превосходное спасибо ... из последних 2 дней я пытаюсь решить эту проблему. .. Большое спасибо – Raj

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