如何从表单启用变量到类Timer

时间:2013-07-11 02:52:50

标签: c#

我在这里有主要的表格类:

        public partial class Main : Form
        {
            public void button_Click(object sender, EventArgs e)
            {
               //here I want to call function runtime() from SchedulingTimer class
                 // in oder to run afunc() every second or any Interval
            }
           public void afunc()
                {
                  Message.Show(textbox1.Text);
                 }
       }

我有一个Timer类:

public class SchedulingTimer
    {

        public static  void runtime()
        {
            Timer myTimer = new Timer();
            myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
            myTimer.Interval =10000 ; // 1000 ms is one second
            myTimer.Start();

        }

        public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
        {
                //call function from main which have agrument textbox.Text
                   afunc();//or any function which variable sended from Main form
        }
    }

但是当我在afunc方法中调用DisplayTimeEvent时会出现一些错误,因为这是static方法,因此无法访问textbox1.Text。我认为我的代码有些错误。

更新

  • 我设置myTimer.Enable= true,然后点击Button但没有 发生。似乎afunc()无效。
  • 在DisplayTimeEvent中创建Main方法的实例。 Main objMain=new Main(); objMain.afunc();并且afunc中有一些细节:

        string keyw = cbkeyw.Text.ToString();
        string link = cblink.Text.ToString();
    
         if (radiobutton.Checked)
        {
            Yahoo yahoo = new Yahoo();
            yahoo.RunProxyYahoo(proxylist, keyw, link, numPage, CountID);
        }
        else
            MessageBox.Show("Please choose Search Engine!");
    

    我在我的afunc中调用Yahoo Class,这真的很困惑。当我点击Button时,它只会显示("Please choose Search Engine!");个事件,但我已经在radiobutton办理了

3 个答案:

答案 0 :(得分:1)

您应该使用System.Windows.Forms.Timer而不是System.Timers.Timer。前者在尝试访问主表单时会避免交叉线程问题。

我问你为什么需要SchedulingTimer课程。我希望表格中有代码。

using System.Windows.Forms;

public partial class Main : Form
{
  Timer myTimer = new Timer { Interval = 10000 };

  public void button_Click(object sender, EventArgs e)
  {
     myTimer.Tick += new EventHandler(OnTick);
     myTimer.Start();
  }
  public void OnTick(object sender, EventArgs ea)
  {
     myTimer.Stop();
     Message.Show(textbox1.Text);
  }
 }

答案 1 :(得分:0)

首先,你应该这样做:_timer.Enabled = true; // Enable it

  Timer myTimer = new Timer();

            myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
            myTimer.Interval =10000 ; // 1000 ms is one second
            myTimer.Enabled = true

答案 2 :(得分:0)

错误的原因是因为runtime方法是静态的,因此您无法直接访问非静态方法/属性。

您可以将Action传递给runtime方法,这样它就会触发您从主Form传入的方法

示例:

private void button1_Click(object sender, EventArgs e)
{
    SchedulingTimer.runtime(afunc);
}


public class SchedulingTimer
{
    public static void runtime(Action callback)
    {
        System.Timers.Timer myTimer = new System.Timers.Timer();

        // when timer fires call the action/method passed in
        myTimer.Elapsed += (s, e) => callback.Invoke();
        myTimer.Interval = 10000; // 1000 ms is one second
        myTimer.Start();
    }
}

但是如果从Timer访问UI控件,则可能需要调用UI线程

private void button1_Click(object sender, EventArgs e)
{
    SchedulingTimer.runtime(() => base.Invoke((Action)delegate 
    {
       afunc();
    }));
}