当前位置: 首页 > 编程笔记 >

C#实现跨线程操作控件方法

靳祺然
2023-03-14
本文向大家介绍C#实现跨线程操作控件方法,包括了C#实现跨线程操作控件方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了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实现html" target="_blank">添加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#之WinForm跨线程访问控件实例,包括了C#之WinForm跨线程访问控件实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中WinForm跨线程访问控件的实现方法,分享给大家供大家参考。 具体实现方法如下: 1、跨线程访问控件委托和类的定义 2、用法 在Form1.cs文件的线程方法中: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍C#多线程与跨线程访问界面控件的方法,包括了C#多线程与跨线程访问界面控件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#多线程与跨线程访问界面控件的方法。分享给大家供大家参考。具体分析如下: 在编写WinForm访问WebService时,常会遇到因为网络延迟造成界面卡死的现象。启用新线程去访问WebService是一个可行的方法。 典型的,有下面的启动新线程示例

  • 本文向大家介绍C#线程池操作方法,包括了C#线程池操作方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#线程池操作方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍c++线程池实现方法,包括了c++线程池实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了c++线程池实现方法。分享给大家供大家参考。具体分析如下: 下面这个线程池是我在工作中用到过的,原理还是建立一个任务队列,让多个线程互斥的在队列中取出任务,然后执行,显然,队列是要加锁的 环境:ubuntu linux 文件名:locker.h 文件名:locker.cpp 文件名

  • 本文向大家介绍C#实现多线程下载文件的方法,包括了C#实现多线程下载文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现多线程下载文件的方法。分享给大家供大家参考。具体实现方法如下: 调用: 希望本文所述对大家的C#程序设计有所帮助。

  • 我已经实现了一个线程池。现在,它的基本操作如下: 空初始化(布尔detached_threads); bool调度(ulux(*dispatch_fn)(ulux), ulux arg, boolfree_arg); void shut\u down(); 静态无效*execute_task(无效*arg); 现在我想添加等待()操作,它将由主线程调用,并等待线程池中的所有线程完成它们正在执行的任