2016-04-17 2 views
0

Я использую этот код для проверки установленных программ (appwiz.cpl) и моего ipconfig каждые 5 секунд.System.Threading.Timer не будет работать постоянно

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

public void time() { 
var time = new System.Threading.Timer(x => 
{ 
    conf(); 
    ncpa("ipconfig /all"); 
}, null, 5000, Timeout.Infinite); 
} 

У меня есть обратный вызов в конце методы «NCPA», а time();

Он работает, но через несколько минут нить будет завершаться с кодом 259, и не будет работать больше.

Спасибо за помощь!

+0

Что вы подразумеваете под обратным вызовом? –

+0

Я вызываю 'time()' для запуска снова, в конце метода 'ncpa()' – Maske13

+0

Таймер уже представляет собой повторную задачу, поэтому, когда вы вызываете 'time()' снова, он запустит еще один таймер , Таким образом, каждые 5 секунд запускается дополнительный таймер, в то время как другие продолжают работать (я не вижу, чтобы вы заканчивали их в любом месте). Попробуйте удалить этот «обратный вызов», который может работать. – bassfader

ответ

1

Во-первых, вы использовали «Бесконечный» для периодического вызова, что означает, что он не будет сигнализировать периодически. Более того, при использовании времени в переменной, подобной этой, это собирается собираться GC после того, как вы выходите из сферы «переменной времени». Попробуйте изменить и сделайте переменную «время» полем вашего класса.

Если это поле экземпляра, то оно не будет иметь ссылок, если у объекта не будет ссылок. Если вы сделаете это статическое поле, оно будет считаться корнем, и ссылка будет сохранена до тех пор, пока вы не измените ее вручную.

Например:

class Program 
{ 
    private static System.Threading.Timer _timer = new Timer(_ => Console.WriteLine("Hi"), 
     null, 1000, 1000); 
    static void Main(string[] args) 
    { 
     Console.ReadLine(); 
    } 
} 

Надеется, что это помогает.

+0

Не могли бы вы показать мне, как? – Maske13

+0

@Tom в вашем классе просто положил «приватный System.Threading.Timer _timer = new ....» –

+0

По какой-то причине я не могу заставить его работать, вы можете изменить свой ответ с помощью кода? Я думаю, что я сделал что-то неправильно. – Maske13