我在这里有主要的表格类:
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
办理了
答案 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();
}));
}