Используйте System.Timers.Timer или System.Threading.Timer вместо Windows.Windows.Forms.Timer
и внутри обработчика событий Elapced
при каждом вызове методов или свойств в пользовательском интерфейсе.элементы управления используют control.InvokeRequired
и control.Invoke
.
проблема с таймером формы заключается в том, что он выполняет действие в потоке пользовательского интерфейса, начиная с msdn :
Таймер Windows предназначен для однопоточной среды, в которой потоки пользовательского интерфейса используются для обработки
Редактировать: Вот пример использования System.Timers.Timer
:
private System.Timers.Timer _chatTimer = new System.Timers.Timer();
public Form1()
{
InitializeComponents();
_chatTimer.Interval = 1000;//1 seconds
_chatTimer.Elapsed += OnChatTimerElapsed;
_chatTimer.AutoReset = true;
}
private void OnChatTimerElapsed(object sender, System.Timer.ElapsedEventArts e)
{
//code to perform when timer elapsed.
}
Edit2: Еще один момент, на который следует обратить внимание: в зависимости от времени выполнения обработчика прошедшего события, если время, необходимое для выполнения кода на нем, превышает 1 секунду, я предлагаю вам установить для _chatTimer.AutoReset
значениеложь и запуск таймера только после завершения предыдущего истекшего события.например, проверьте это .