我自己找例子写了个Mmtimer定时器的类文件,在窗体里面应用mmtimer,只是想用Tick事件在窗体的 textBox1控件内显示随机数,报错是Control.Invoke 必须用于与在独立线程上创建的控件交互
线程框显示确实是有mmtimertest.Mmtimer.Start和mmtimertest.Form1.mmtimer1_Tick两个线程
请问如何利用委托实现在窗体控件调用Mmtimer这个类的方法或事件
private void Form1_Load(object sender, EventArgs e)
{
this.mmtimer1.Tick += new System.EventHandler(mmtimer1_Tick);
}
private Mmtimer mmtimer1 = new Mmtimer();//类的实例化
Random ran = new Random();
private static int Random_MinNum = 10;
private static int Random_MaxNum = 300;
private void button1_Click(object sender, EventArgs e)
{
mmtimer1.Start(10,true);
}
private void mmtimer1_Tick(object sender, EventArgs e)
{
int b = ran.Next(Random_MinNum, Random_MaxNum);
string ss = DateTime.Now.ToString();
textBox1.Text = ss;
}
------解决思路----------------------
这样就可以了,跟写delegate一样,匿名实现了
private void mmtimer1_Tick(object sender, EventArgs e)
{
int b = ran.Next(Random_MinNum, Random_MaxNum);
Action async = () => { textBox1.Text = DateTime.Now.ToString(); };
this.Invoke(async);
}
------解决思路----------------------
//先写一个函数,就是你最终要做的事
function void FinalWork(string text) {
extBox1.Text = text;
}
//然后是你的线程函数里
private void mmtimer1_Tick(object sender, EventArgs e) {
//创建委托,就是上面的FinalWork转换成Delegate类型
Action<string> action = new Action<string>(FinalWork);
//调用委托需要的参数,这里就1个ss
object[] para = new object[]{ss};
//用随便哪个控件的Invoke方法调用委托
this.Invoke(action, para);
}
这样够详细了吧
简化了以后就我那楼的写法