0

我在这里有主表单类:

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

我有一个计时器类:

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

但是当我调用方法时afuncDisplayTimeEvent它有一些错误,因为这是一个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!");event 虽然我已经签radiobutton

4

3 回答 3

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);
  }
 }
于 2013-07-11T03:17:42.027 回答
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
于 2013-07-11T03:05:43.223 回答
0

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

您可以将 an 传递Actionruntime方法,这样它就会触发您从 main 传入的方法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();
    }));
}
于 2013-07-11T03:16:41.267 回答