我尝试了所有方法。
-事件
-无法使用Invoke,因为计时器没有InvokeRequired属性。
-公有/内部属性
什么都不起作用,代码正在执行,计时器的Enabled属性被设置为“true”,但它不会Tick。如果我在非静态方法中从表单类调用事件或只更改属性,则会Tick并正常工作。
我从未想到学习如何使用一个体面的计时器需要花费我一天甚至更多的时间。
如果没有办法做到这一点,是否有其他可以像计时器一样工作(延迟,启用/禁用)的东西可供使用?
我尝试了所有方法。
-事件
-无法使用Invoke,因为计时器没有InvokeRequired属性。
-公有/内部属性
什么都不起作用,代码正在执行,计时器的Enabled属性被设置为“true”,但它不会Tick。如果我在非静态方法中从表单类调用事件或只更改属性,则会Tick并正常工作。
我从未想到学习如何使用一个体面的计时器需要花费我一天甚至更多的时间。
如果没有办法做到这一点,是否有其他可以像计时器一样工作(延迟,启用/禁用)的东西可供使用?
http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx
您不需要在控件本身上检查 InvokeRequired
,您可以在类上检查该属性,例如:
if (this.InvokeRequired)
{
BeginInvoke(new MyDelegate(delegate()
{
timer.Enabled = true;
}));
}
我不小心又尝试了一次调用,这次它起作用了,但我会接受你的答案,DavidM。
public bool TimerEnable
{
set
{
this.Invoke((MethodInvoker)delegate
{
this.timer.Enabled = value;
});
}
}
public static void timerEnable()
{
var form = Form.ActiveForm as Form1;
if (form != null)
form.TimerEnable = true;
}
this
调用。我认为一种可扩展的方法是由 @David M 提出的。 - nawfal仅仅因为 System.Windows.Forms.Timer
没有调用的能力,并不意味着你的窗体没有。尝试使用我的 InvokeEx
方法来自第二个(或其他)线程启用计时器。
public static class ControlExtensions
{
public static TResult InvokeEx<TControl, TResult>(this TControl control,
Func<TControl, TResult> func)
where TControl : Control
{
if (control.InvokeRequired)
{
return (TResult)control.Invoke(func, control);
}
else
{
return func(control);
}
}
}
有了这个,以下的代码对我起作用:
new Thread(() =>
{
Thread.Sleep(1000);
this.InvokeEx(f => f.timer1.Enabled = true);
}).Start();
1秒后,计时器立即开始工作。