- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 myForm_FormClosing 之后是否有任何机会调用 timer_Tick在下面的代码中。
如果有机会:在 myForm_FormClosing 中调用 timer.Stop() 是否足以避免在 myForm_FormClosing 之后调用 timer_Tick?
using System;
using System.Windows.Forms;
using System.ComponentModel;
namespace Test
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyForm());
}
}
class MyForm : Form
{
private IContainer components;
private Timer timer;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
public MyForm()
{
components = new Container();
timer = new Timer(components);
timer.Interval = 50;
timer.Tick += timer_Tick;
timer.Enabled = true;
FormClosing += myForm_FormClosing;
}
private void timer_Tick(object sender, EventArgs e)
{
}
private void myForm_FormClosing(object sender, FormClosingEventArgs e)
{
}
}
}
更新:在收到一些提示(感谢帮助)后,我基本上选择了以下代码来实现我想要的。请注意,调用 myForm_FormClosing 后仍然可以调用 timer1_Tick!这个解决方案只是引入了一个标志(我称之为 doWork),它在调用 myForm_FormClosing 之后停止执行 timer1_Tick 中的代码。
using System;
using System.Windows.Forms;
using System.ComponentModel;
namespace Test
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyForm());
}
}
class MyForm : Form
{
private IContainer components;
private Timer timer;
private bool doWork = true;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
public MyForm()
{
components = new Container();
timer = new Timer(components);
timer.Interval = 50;
timer.Tick += timer_Tick;
timer.Enabled = true;
FormClosing += myForm_FormClosing;
}
private void timer_Tick(object sender, EventArgs e)
{
if (doWork)
{
//do the work
}
}
private void myForm_FormClosing(object sender, FormClosingEventArgs e)
{
doWork = false;
}
}
}
最佳答案
是的,这是可能的。根据the docs ...
Occurs before the form is closed.
When a form is closed, it is disposed, releasing all resources associated with the form.
直到 FormClosing 事件之后,计时器才会被释放。这是一个非常人为的例子来说明它是如何发生的。在调用 FormClosing 之后,您将看到您在 Timer tick 上命中了调试器断点。
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);
}
}
}
关于c# - FormClosing 后计时器滴答?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11957486/
我正在开发一个 C# 应用我需要在用户关闭表单之前进行一些验证。 我尝试使用 FormClosing 事件,但没有成功,后来我用了FormClosed事件,但是一样。 问题是,当我单击“关闭按钮”(在
在 myForm_FormClosing 之后是否有任何机会调用 timer_Tick在下面的代码中。 如果有机会:在 myForm_FormClosing 中调用 timer.Stop() 是否足以
我有一个组合框来设置用户文化: 如果我更改 Culture 值 x 次,当用户尝试退出时,FormClosing 方法将被触发 x 次。 这是我的 FormClosing 事件: privat
我的电脑有一个备用电源,它与电脑和墙壁串联连接。当我从墙上拔下电源线时,备用电源会在 2-5 分钟后关闭计算机。正是在这段时间里,我想使用以下代码将数据写入文件: private void Form1
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我尝试调用 FormClose 方法,但尝试时其参数出现问题: FormName.FormClose(nil, CaFree); 通常,我可以使用 nil 或 sender as TOBject 来调
当 FormClosing 中抛出异常时,我无法使用正常的 try/catch 捕获它 - 为什么不呢? 例子: public partial class Form2 : Form {
我有两个表单并将它们链接起来,这样当第二个表单关闭时,第一个表单也会关闭(使用 FormClosing 方法)。 问题是,当我想隐藏第二个表单时,它会自动关闭第一个。有没有一种方法可以在不实际调用 F
我试图在关闭菜单表单时关闭我的应用程序。这是我的代码: private void frmMenu_FormClosing(object sender, FormClosingEventArgs e)
我从主窗体中打开了一个子窗体,如下所示: var cf = new ChildForm { Owner = this }; cf.Show(); 然后子窗体在另一个线程上进行一些绘制。 当用户试图关闭
我的主窗体上有一个 ToolStripButton 并附加了一个单击事件,单击它会打开一个对话框并将 toolStripButton 的 Checked 状态设置为“true”。在通过上述单击打开的窗
我想在程序中的 Form 关闭时收到通知,以便我可以保存其子控件的状态,然后在下次打开该窗体时恢复这些控件状态。我将用于保存控件状态的代码放在窗体的 FormClosing 方法中。但是,如果关闭主窗
我有一个 MainForm。我可以使用关闭按钮(右上角)或单击菜单项 miExit 来关闭它。 我的问题是当我单击 miExit 并回答“确定”时,它显示消息框 TWICE。我该如何解决? (我明白为
我有以下代码: private void form1_closing(object sender, FormClosingEventArgs e) { e.Cancel = true;
我有一个简单的基于表单的 .NET 应用程序。在此,我捕获 FormClosing 事件以防止关闭应用程序,而是将其最小化。该应用程序应始终打开。这是我使用的代码: private void Brow
我遇到了一个问题,我无法等待 FormClosing 事件中的异步函数,该函数将确定表单关闭是否应该继续。我创建了一个简单的示例,如果您关闭而不保存(很像记事本或 Microsoft Word),它会
我有一个简单的 Windows 窗体,它在运行时托管属性控件。当用户单击关闭 [X] 时,我希望保持窗口及其内容处于事件状态,而不是通过处理 FormClosing 事件、取消事件并简单地隐藏表单来杀
在 Delphi 7 中,我有一个 TMainForm.FormClose 过程,旨在在程序退出时写出一些状态。这在手动关闭程序时效果很好。但是,我发现如果程序被 Windows“强制”退出(例如在
这个问题可能看起来像重复,但我在测试我的程序时遇到了这个问题,我对你如何解决它感到有点困惑。 我有一个 winform,它有一个表单关闭事件。在这种情况下,我会弹出一个消息框,询问用户“你确定要关闭窗
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.Load, Me.For
我是一名优秀的程序员,十分优秀!