关于多线程Thread和委托delegate的用法
(2012-12-28 08:52:18)
标签:
webc杂谈 |
分类: c# |
最近在写一个小程序,用到了Thread 和 委托
delegate
if
(this.webBrowser1.InvokeRequired)//这里可以理解成判断是否可以直接访问,如果不能则使用委托
{
}
else
{
}
p.Children.Clear();
p.Children.Add(new
TextBlock { Text = text });
if
(p.Dispatcher.CheckAccess()) AddText(p, "Added directly.");
else
p.Dispatcher.BeginInvoke(
new AddTextDelegate(AddText), p, "Added by
Dispatcher.");
这里总结一下我的用法,我选取的是我觉得比较简单的用法,如果大家有别的觉得更方便的方法可以和我交流交流。
关于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)
{
DelUserHandler handler = new
DelUserHandler(next);
this.Invoke(handler);
//这里写你想要执行的函数;
//我这里是让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)
{
}
private void TestBeginInvokeWithParameters(Panel p)
{
}
dispatcher的资料来自:http://blog.sina.com.cn/s/blog_685790700100kb1b.html
后一篇:c#中获取文件并对其操作