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!");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メソッドが静的であるため、非静的メソッド/プロパティに直接アクセスできないためです。

メソッドにを渡すと、メインから渡しActionruntimeメソッドが起動されます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();
    }
}

ただし、タイマーから UI コントロールにアクセスしている場合は、UI スレッドを呼び出す必要がある場合があります。

private void button1_Click(object sender, EventArgs e)
{
    SchedulingTimer.runtime(() => base.Invoke((Action)delegate 
    {
       afunc();
    }));
}
于 2013-07-11T03:16:41.267 に答える