飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

多线程安全调用UI控件的方法

Author:flymorn Source:flymorn
Categories:C#编程 PostTime:2011-5-15 0:57:05
正 文:
    C#中多线程安全调用主线程中UI控件的方法,其实无非就是委托invoke方法的利用罢了。

方法一--简单的invoke

//把不使用UI线程的代码放到invoke方法外面
例如下面的代码会一直占用UI线程:
void test()
{
  this.invoke(new Action(()=>
  {
    int n=0;
    for(var i=0;i<1000000;i++)
    {
      n+=i
    }
    this.Text=n.ToString();
  }));
}

//下面的就不会,只有在需要UI线程的时候使用
void test()
{
  int n=0;
  for(var i=0;i<1000000;i++)
  {
    n+=i
  }
  this.invoke(new Action(()=>
  { 
    this.Text=n.ToString();
  }));
}

方法二-常规的invoke:
public delegate void DoCallBack(form1 frm, string crid); //委托
public void fabu(form1 frm, string crid)
{
    frm.Invoke(new DoCallBack(fabu2), new object[] { frm, crid });
}
public void fabu2(fabu frm, string crid)
{ // 这里操作UI主窗体的控件
    webBrowser1.Navigate("http://www.piaoyi.org/");
}

【实际实例】:

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread threadGet1, threadGet2; 
            threadGet1 = new Thread(new ThreadStart(doGetFromXml1)); 
            threadGet2 = new Thread(new ThreadStart(doGetFromXml2)); 
            threadGet1.Start();
            threadGet2.Start(); 
        }
 
        object sysobj = new Object();
 
        public void doGetFromXml1()
        { 
            while (true)
            {
                lock (sysobj)
                {
                    ShowMessage("oooo\r\n");
                }
            } 
        }
 
        public void doGetFromXml2()
        { 
            while (true)
            { 
                lock (sysobj)
                {
                    ShowMessage("aaaa\r\n");
                }
            } 
        }
 
        delegate void ShowMess(String s);
        void ShowMessage(string s)
        {
            if (this.richTextBox1.InvokeRequired == true)
            {
                this.richTextBox1.Invoke(new ShowMess(ShowMessage),new object[]{s});
            }
            else
            {
                this.richTextBox1.Text = s;
            }
        }

相关阅读:多线程问题:窗体中的线程安全调用
作者:flymorn
来源:flymorn
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
Tag:多线程 浏览(次) 我要评论(1条)
上一篇:赢网关键词指数工具:百度指数批量查询!
下一篇:503 Service Temporarily Unavailable:网站临时维护,你该做什么?
1条评论 “多线程安全调用UI控件的方法”
2011-5-15 15:48:24
又是程序员干的?压根看不懂,呵呵!
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2010 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有 渝ICP备07006361号