C# 从c类访问窗体控件#windows窗体

C# 从c类访问窗体控件#windows窗体,c#,winforms,.net-4.0,C#,Winforms,.net 4.0,嗨 我的主窗体上有一个计时器控件,它创建一个类的实例,在某些情况下,该类的方法需要停止计时器 有没有一种方法可以将timers Enabled属性设置为false而不将控件传递给方法 我可以检查一下mainform上的所有控件的计时器,然后禁用它吗?我想让这个类有一个构造函数,它要么接受一个接口 interface IStopTimer { void StopTimer(); } class MyClass { public MyClass(IStopTimer stopTim

嗨 我的主窗体上有一个计时器控件,它创建一个类的实例,在某些情况下,该类的方法需要停止计时器

有没有一种方法可以将timers Enabled属性设置为false而不将控件传递给方法


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

我想让这个类有一个构造函数,它要么接受一个接口

interface IStopTimer
{
    void StopTimer();
}

class MyClass
{
    public MyClass(IStopTimer stopTimer)
    ...
或代表

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

或者可能是定时器方法来实现同样的事情。这样,类就不依赖于Windows窗体,也不知道您在使用什么作为计时器。

无论如何,该方法都需要对计时器的引用(直接或间接)来停止计时器。你可以在它上面分层抽象,但它不会很漂亮


您是否可以使用类似于
ThreadPool.QueueUserWorkItem()
的东西来启动计时器执行的操作?这样,当操作完成时,线程将返回到池中,并且您有一个“触发并忘记”机制。

您可以从类中创建一个事件,停止计时器,并在需要时引发它。从外部类(主窗体)安装类后,订阅该事件并停止处理程序中的计时器

以下是您发起活动的方式:

    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;
    }
}

这个设计听起来有点奇怪-也许值得解释一下你想要实现的更广泛的背景,并征求关于如何简化的建议-最好在单独的问题中提出这个问题谢谢Neil,在正常情况下,计时器运行exery x min并更新表单上的项目负载。但是,为什么计时器触发的方法需要停止计时器?这不是计时器触发的事件,基本上是如果计时器事件之间发生了某件事,计时器事件将与之交互,我想停止计时器。嗨,Yuriy,谢谢,你可以告诉我,我是c#的新手。。。我不知道如何实现你的建议,你介意给我更多的演示一下如何做到这一点吗?我可以,我应该使用互斥吗?还是这太过分了?