手机
当前位置:查字典教程网 >编程开发 >C#教程 >C#实现跨线程操作控件方法
C#实现跨线程操作控件方法
摘要:本文实例讲述了C#实现跨线程操作控件方法,分享给大家供大家参考。具体实现方法如下:由于在.net平台下Winform、wpf禁止跨线程直接访...

本文实例讲述了C#实现跨线程操作控件方法,分享给大家供大家参考。具体实现方法如下:

由于在.net平台下Winform、wpf禁止跨线程直接访问控件,因此在必须跨线程访问控件的时候采用异步方式。

1、winform项目中跨线程访问控件:

编写一个Winform小实例:在做winform项目中,有时为了将系统运行的状态实时显示到Form中,因此添加一个RichTextbox控件实时显示系统运行日志。本例实现的操作是将日志以字符串的形式写入RichTextbox控件,因为是实时显示,所以涉及到跨线程输入的问题。

复制代码 代码如下:private delegate void setRichTexBox(string s);

public void setText(string txt)

{

if (this.t_revmsg.InvokeRequired)//等待异步

{

setRichTexBox fc = new setRichTexBox(Set);

this.Invoke(fc, new object []{ txt});

}

else

{

this.t_revmsg.AppendText(txt);

}

}

private void Set(string txt)

{

t_revmsg.AppendText(txt);

}

控件的InvokeRequired的值为true时,说明有一个不属于创建它的线程要访问它,此时需要采用异步的方式进行操作。

2、wpf项目中跨线程访问控件:

wpf的page页中,加入一个button控件和textbox控件,点击button实现添加textbox控件中的内容。

复制代码 代码如下:private void button2_Click(object sender, RoutedEventArgs e)

{

this.textBox1.Dispatcher.Invoke(new WriteDelegate(WriteMethod), "asdf");

}

private delegate void WriteDelegate(string str);

private void WriteMethod(string str)

{

this.textBox1.AppendText(str);

}

3、wpf项目中跨线程获取textbox控件中的内容

本实例实现的功能是:点击button控件,开启socket监听服务。监听的端口需要从UI界面中的textbox中获取,因为不是创建它的线程访问它,因此才有Dispatcher.Invoke异步操作。稍作补充:在开启监听的过程中,有while(true)死循环,将其直接放入到主线程都会导致线程无法正常进行下去,解决方法是开启一个新的线程来开启监听。

复制代码 代码如下:private void button1_Click(object sender, RoutedEventArgs e)

{

Thread thread = new Thread(new ThreadStart(StartServer));

thread.Start();

}

public void StartServer()

{

int port = Convert.ToInt32(GetText(this.tbPort));

ServerSocket serverSocket = new ServerSocket(port);

serverSocket.Start();

}

private delegate string GetTextHandle(Control control);

private string GetText(Control control)

{

if (this.Dispatcher.Thread != System.Threading.Thread.CurrentThread)

{

return (string)this.Dispatcher.Invoke(new GetTextHandle(this.GetText), control);

}

else

{

if (control.GetType() == typeof(TextBox))

{

return ((TextBox)control).Text;

}

else

{

return string.Empty;

}

}

}

总结:

由上述几个实例可以看到跨线程调用需要使用Invoke和BeginInvoke(暂时没有用到),在一些要求并不是很严格的系统中,暂且认为二者是可以通用的。感兴趣的朋友可以测试运行一下。通过实践会收获的更多!

希望本文所述对大家的C#程序设计有所帮助。

【C#实现跨线程操作控件方法】相关文章:

C#获取进程和对进程的操作

C# WinForm中Panel实现用鼠标操作滚动条的实例方法

C# 操作XML文档 使用XmlDocument类方法

C#线程 BeginInvoke和EndInvoke使用方法

C#实现窗体淡入淡出效果的方法总结

C# dynamic关键字的使用方法

.net后台获取html控件值的2种方法

C# TrieTree介绍及实现方法

C#操作config文件的具体方法

C#用Lambda和委托实现模板方法

精品推荐
分类导航