本文介绍了之后的FormClosing计时器滴答?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有任何的机会,timer_Tick可以在下面的代码myForm_FormClosing
之后被调用。
如果有机会的话:是不是足以叫内myForm_FormClosing timer.Stop(),以避免timer_Tick被myForm_FormClosing后调用
使用系统? ;使用System.Windows.Forms的
;
使用System.ComponentModel;
命名空间测试
{
静态类节目
{
[STAThread]
静态无效的主要()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(假);
Application.Run(新的MyForm());
}
}
类MyForm的:表格
{
私人的IContainer组件;
私人定时器定时器;
保护覆盖无效的Dispose(BOOL处置)
{
如果(处置和放大器;及(成分= NULL)!)
{
组分。的Dispose();
}
base.Dispose(处置);
}
公共MyForm的()
{
组分=新的Container();
定时器=新定时器(组件);
timer.Interval = 50;
timer.Tick + = timer_Tick;
timer.Enabled = TRUE;
的FormClosing + = myForm_FormClosing;
}
私人无效timer_Tick(对象发件人,EventArgs五)
{
}
私人无效myForm_FormClosing(对象发件人,FormClosingEventArgsê )
{
}
}
}
更新:
receving一些提示(感谢帮助)我基本上都选择了下面的代码才达到我想要的东西之后。
请不是timer1_Tick仍然可以被称为myForm_FormClosing被称为后!
该溶液只引入了一个标志(ⅰ称它为的doWork),其停止myForm_FormClosing被称为后要执行内timer1_Tick代码
使用系统;使用System.Windows.Forms的
;
使用System.ComponentModel;
命名空间测试
{
静态类节目
{
[STAThread]
静态无效的主要()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(假);
Application.Run(新的MyForm());
}
}
类MyForm的:表格
{
私人的IContainer组件;
私人定时器定时器;
私人布尔的doWork = TRUE;
保护覆盖无效的Dispose(BOOL处置)
{
如果(处置和放大器;及(成分= NULL)!)
{
组分。的Dispose();
}
base.Dispose(处置);
}
公共MyForm的()
{
组分=新的Container();
定时器=新定时器(组件);
timer.Interval = 50;
timer.Tick + = timer_Tick;
timer.Enabled = TRUE;
的FormClosing + = myForm_FormClosing;
}
私人无效timer_Tick(对象发件人,EventArgs五)
{
如果(的doWork)
{
//做的工作
}
}
私人无效myForm_FormClosing(对象发件人,FormClosingEventArgs E)
{
的doWork = FALSE;
}
}
}
解决方案
是的,它是可能的。据 ...
The timer will not be disposed until after the FormClosing event. Here is a very contrived example of how it can happen. You will see that you hit the debugger breakpoint on the Timer tick after FormClosing has been called.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private System.Windows.Forms.Timer _time = new System.Windows.Forms.Timer();
private Task _t1 = null;
private Task _t2 = null;
private bool _closingFlag = false;
public Form1()
{
InitializeComponent();
_time.Interval = 50;
_time.Tick += (s, e) => {
textBox1.Text = DateTime.Now.ToString();
if (_closingFlag) Debugger.Break();
};
_time.Start();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
_closingFlag = true;
_t1 = Task.Factory.StartNew(() => { Thread.Sleep(1000); });
_t2 = Task.Factory.StartNew(() => { Thread.Sleep(1000); });
Task.WaitAll(_t1, _t2);
}
}
}
这篇关于之后的FormClosing计时器滴答?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!