У меня есть таймер в приложении форм Windows (Visual C#), что вызывает проблемы, когда я хочу выйти из приложения.Как предотвратить событие с истечением таймера, если приложение формы закрывается C#
Таймер определяется в качестве члена класса формы в:
partial class Form1
{
//These are the members in question:
internal ComACRServerLib.Channel channel;
private System.Timers.Timer updateStuff;
}
Таймер объявляется/построено в конструкторе формы приложения:
public Form1()
{
InitializeComponent();
updateStuff = new System.Timers.Timer();
updateStuff.Elapsed += new System.Timers.ElapsedEventHandler(updateStuff_Elapsed);
}
Таймер запускается и конфигурируется с нажатие одной кнопки:
private void btnAcquire_Click(object sender, EventArgs e)
{
updateStuff.Interval = 100;
updateStuff.Enabled = true;
updateStuff.AutoReset = true;
updateStuff.Start();
}
Когда таймер истекает, он вызывает updateStuff_Elapsed
, который получает информацию для отображения с setText
(есть код, чтобы убедиться, что вызов setText
является потокобезопасным).
private void updateStuff_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (!channel.isOffline)
{
object[] status = channel.GetACRCustom("P6144");
setText(System.Convert.ToString(status[0]));
}
}
public delegate void setTextDelegate(string text);
public void setText(string text)
{
if (this.lblTest.InvokeRequired == true)
{
setTextDelegate d = new setTextDelegate(setText);
this.Invoke(d, new object[] { text });
}
else
{
lblTest.Text = text;
}
}
На выходе из приложения я пытаюсь избавиться от таймера и предотвратить его снова стреляя со следующим:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
updateStuff.AutoReset = false;
updateStuff.Stop();
updateStuff.Close();
updateStuff.Dispose();
components.Dispose();
}
base.Dispose(disposing);
}
Но если таймер autorunning и я выйти из программы, я всегда получаю ошибки, которые подпрограмма, вызванная событием с истечением таймера updateStuff_elapsed
, пытается использовать уже имеющиеся ресурсы! Несмотря на то, что я изо всех сил старался остановить и уничтожить таймер перед удалением.
Как остановить таймер от срабатывания при закрытии приложения?
EDIT
Я попытался переместить Dispose
код вокруг, чтобы попытаться заставить таймер не закрывать, но не повезло. Я также попытался использовать updateStuff.Elapsed -= updateStuff_Elapsed
, чтобы удалить вызов события перед остановкой и удалением;
protected override void Dispose(bool disposing)
{
//now this code HAS to run always.
updateStuff.Elapsed -= updateStuff_Elapsed;
updateStuff.AutoReset = false;
updateStuff.Stop();
updateStuff.Close();
updateStuff.Dispose();
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Попробуйте сначала удалить событие «updateStuff.Elapsed - = updateStuff_Elapsed;», затем выполните код удаления. Вероятно, это должно быть сделано в методе 'FormClosing', и просто вызовите' updateStuff.Dispose' в методе 'Dispose'. –
Я попытался вызвать 'updateStuff.Elapsed - = updateStuff_Elapsed' перед остановкой, закрытием, отключением таймера, не повезло. У моего приложения форм нет метода FormClosing, является ли метод класса формы, из которого form1 является подклассом? – OrangeSherbet
Вам нужно добавить переопределение. В вашем классе формы начните вводить 'override', и вы увидите' OnFormClosing' в списке методов, выберите его, чтобы создать переопределение и поместить туда код. В качестве альтернативы вы можете создать событие в конструкторе для события FormClosing, но вы должны переопределить его, а не использовать внутренние события, подобные этому. –