当前位置: 代码迷 >> C# >> 怎么利用委托解决跨线程有关问题
  详细解决方案

怎么利用委托解决跨线程有关问题

热度:48   发布时间:2016-05-05 02:39:02.0
如何利用委托解决跨线程问题?
我自己找例子写了个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);
}

这样够详细了吧
简化了以后就我那楼的写法
  相关解决方案