2010-11-01 64 views
0

嗨 我有一个计时器控制我的主窗体上创建一个类的实例,在某些情况下类的方法需要停止计时器。访问窗体控件​​从类C#窗体

有没有办法将定时器Enabled属性设置为false而不通过控制进入方法?

我可以怎么检查计时器的mainform上的所有控件,然后禁用它?

+0

设计听起来有点怪怪的 - 这可能是值得向大家解释了更广阔的背景你试图达到什么样的目标,并要求提供如何简化的建议 - 这将是最好的问题在一个单独的问题 – 2010-11-01 11:47:13

回答

0

您可以从类中创建一个事件来停止定时器,并在您希望发生此事时将其提升。从外部类(主窗体)启动类后,您订阅该事件并停止处理程序中的计时器。

这是怎么引发事件:

class Class1 
{ 
    public event EventHandler StopTimer; 

    public void SomeMethod() 
    { 
     if (StopTimer != null) 
      StopTimer(this, EventArgs.Empty); 
    } 

} 

这就是你必须在主窗体:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Class1 myClass = new Class1(); 
     myClass.StopTimer += new EventHandler(myClass_StopTimer); 

     timer1.Enabled = true; 
     timer1.Start(); 
    } 

    void myClass_StopTimer(object sender, EventArgs e) 
    { 
     timer1.Stop(); 
     timer1.Enabled = false; 
    } 
} 
1

我有这个类有一个构造函数,要么需要一个接口

interface IStopTimer 
{ 
    void StopTimer(); 
} 

class MyClass 
{ 
    public MyClass(IStopTimer stopTimer) 
    ... 

或委托

class MyClass 
{ 
    public MyClass(Action stopTimer) 
    ... 

或可能计时器的方法来达到同样的事情。这样这个类不依赖于Windows窗体,并且不知道你用于定时器的是什么。

+0

嗨Yuriy,谢谢,你可以告诉我新的C#...我不知道如何实现你在暗示什么,你想介绍一下如何做到这一点? – Adrian 2010-11-01 13:02:36

+0

我可以,我应该使用Mutex吗?或者这是矫枉过正? – Adrian 2010-11-01 13:06:23

0

这样或那样的方法将需要一个引用(直接或间接)的计时器来停止它。你可以对它抽象层,但它不会很漂亮。

您可以使用类似ThreadPool.QueueUserWorkItem()而不是定时器来启动计时器执行的操作吗?这样当操作完成后,线程将返回到池中,并且您有一个“即忘即忘”机制。

+0

谢谢尼尔,在正常情况下,定时器运行exery x分钟并更新表单上的项目负载。 – Adrian 2010-11-01 13:00:44

+0

但是,为什么定时器触发的方法需要停止定时器? – 2010-11-01 13:49:01

+0

它不是定时器触发的事件,基本上如果定时器事件之间发生某些事情,定时器事件将与之交互,我想停止定时器。 – Adrian 2010-11-02 21:48:19