加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于多线程Thread和委托delegate的用法

(2012-12-28 08:52:18)
标签:

web

c

杂谈

分类: c#
最近在写一个小程序,用到了Thread 和 委托 delegate 
这里总结一下我的用法,我选取的是我觉得比较简单的用法,如果大家有别的觉得更方便的方法可以和我交流交流。
关于Thread:
一开启一个线程为例:
Thread th;
th = new Thread(new ThreadStart(func));//这里也可以写成th = new Thread(func)
th.Start();
public void func()
{
//这里写想要在多线程中执行的函数;
//例如这里我让他死循环。。。但这不会让UI界面假死
while(true)
{
}
}

关于delegate函数:
public delegate void DelUserHandler(void); 
public void next(void) 
   if (this.webBrowser1.InvokeRequired)//这里可以理解成判断是否可以直接访问,如果不能则使用委托
   {
DelUserHandler handler = new DelUserHandler(next); 
this.Invoke(handler);
   
   else
   {
//这里写你想要执行的函数;
//我这里是让webbrowser对next-btn发送一个单击命令;
x = this.webBrowser1.document.getElementByIdx_x_x_x("next-btn"); 
x.InvokeMember("click");
   }
}
这里这个委托函数应该这样理解,当你在子线程中要访问UI线程中的控件时,因为子线程不是创建控件的线程,所以c#是不允许你直接访问的,只有创建一个委托函数委托UI线程代为访问。
首先在子线程调用next()时,会发现this.webBrowser1.InvokeRequired属性值为true,即需要使用委托,此时就新建一个委托函数,等到线程切换到主线程即UI线程时,UI线程会发现有一个委托请求,此时会重新调用next函数,发现此时this.webBrowser1.InvokeRequired属性值为false,则就可以执行else里面的语句从而更新UI界面了。
不过这里不知道为什么用
handle +=new DelUserHandler(next);
是不正确的,理解还有点误差。

如果理解不当请大家告知。。。


现在发现对于除webBrowser以外的控件,则应该使用dispatcher。如:
private delegate void AddTextDelegate(Panel p, String text);

private void AddText(Panel p, String text)
{
    p.Children.Clear();
    p.Children.Add(new TextBlock { Text = text });
}

private void TestBeginInvokeWithParameters(Panel p)
{
    if (p.Dispatcher.CheckAccess()) AddText(p, "Added directly.");
    else p.Dispatcher.BeginInvoke(
        new AddTextDelegate(AddText), p, "Added by Dispatcher.");
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有