假设我们在 .Net 应用程序中使用 System.Windows.Forms.Timer,在计时器上使用 Start() 和 Stop() 方法与使用 Enabled 属性之间有什么有意义的区别吗?
例如,如果我们希望在进行某些处理时暂停计时器,我们可以这样做:
myTimer.Stop();
// Do something interesting here.
myTimer.Start();
或者,我们可以这样做:
myTimer.Enabled = false;
// Do something interesting here.
myTimer.Enabled = true;
如果没有显着差异,社区对于选择哪个选项是否达成共识?
来自微软的文档:
调用Start方法是一样的 将启用设置为 true。同样地, 调用 Stop 方法与 将启用设置为 false。
http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.enabled.aspx
所以,我想没有什么区别...
不,他们是等价的。
参见 Timer.Enabled 和 Timer.Start / Timer.Stop
为了添加关于共识的问题,我想说使用启动/停止方法可能是更好的做法,而且我认为它的可读性也更好。
詹姆斯。
就我个人而言,除了更改值之外,我不喜欢设置属性产生太多后果,因此我倾向于坚持使用
Start()
/Stop()
,因为我很清楚(呃)当你调用一个方法时,你是在要求发生一些事情。
也就是说,我不认为对于设置
Enabled = true
的用途存在很多歧义 :)
这里有一个简单的代码来测试
Enabled
、Start()
、Stop()
如何相互协作。
制作一个测试 Windows 窗体应用程序,添加两个简单的按钮并将此代码粘贴到
Form1()
构造函数中:
int c = 0;
Timer tmr1 = new Timer()
{
Interval = 100,
Enabled= false
};
tmr1.Tick += delegate
{
c++;
};
// used to continously monitor the values of "c" and tmr1.Enabled
Timer tmr2 = new Timer()
{
Interval = 100,
Enabled = true
};
tmr2.Tick += delegate
{
this.Text = string.Format("c={0}, tmr1.Enabled={1}", c, tmr1.Enabled.ToString());
};
button1.Click += delegate
{
tmr1.Start();
};
button2.Click += delegate
{
tmr1.Stop();
};
我不使用
timer.Stop()
和 timer.Start()
,因为它们是 timer.Enabled
的子集。如果你想在应用程序开始时(加载时)将计时器设置为 false,则必须使用 timer.Enabled = false
,timer.Stop()
不起作用。这就是我使用timer.Enabled = false/true
的原因。
我听说了一些关于它们之间差异的原因。我是 C# 新手,所以我无法识别它们是否正确。
你可以问自己一个关键问题:
为什么微软采用两种方法来做同样的事情而没有任何区别?愚蠢?决不。所以有一些原因:
threading
方面(Youtube链接)
.Start() 和 .Stop() 都使用
main thread
Enabled,创建一个
separate thread
,从而避免使用主线程。简而言之,这会带来更好的性能和更可靠的代码。此外,它在事件发生的顺序方面提供了更好的灵活性。
然而,重要的是要意识到线程的危险,例如竞争条件和死锁
running
方面
虽然它们具有相同的功能,但在运行方面有所不同。 就运行方面而言,您的程序应该在不同的系统上运行稳定。一些旧系统或旧窗口无法仅通过使用
Enabled = true
来设置.Start()
。所以最好先设置Enabled = true,然后使用.Start()/.Stop()。但是在新系统和 Windows 上没有区别。 (比如:为什么榨汁机除了电源插头之外还有电源按钮?)