正 文:
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;
}
}
相关阅读:
多线程问题:窗体中的线程安全调用。