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

作者:shichen2014 时间:2023-06-30 13:47:39 

本文实例讲述了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#,线程,控件
0
投稿

猜你喜欢

  • 详解Android中的MVP架构分解和实现

    2022-11-30 08:06:29
  • Spring Data JPA 之 JpaRepository的使用

    2023-11-24 21:23:40
  • Android Studio 3.0的下载安装教程

    2021-08-10 04:00:45
  • Kotlin实用语法糖空安全类型转换及相等性判断

    2021-09-03 20:23:49
  • Entity Framework代码优先(Code First)模式

    2022-07-28 05:31:05
  • 分别在Groovy和Java中创建并初始化映射的不同分析

    2023-11-26 08:15:42
  • SpringCloud+RocketMQ实现分布式事务的实践

    2022-04-06 16:33:04
  • Java线程的五种状态介绍

    2023-06-16 01:22:15
  • C#从画刷创建画笔的方法

    2022-11-22 15:49:17
  • Java中使用开源库JSoup解析HTML文件实例

    2023-10-18 11:46:16
  • C#中的多线程多参数传递详解

    2023-08-02 22:23:46
  • 将项目上传到Maven中央仓库(2023最新版)

    2022-11-24 18:25:12
  • Android 动画实现几种方案

    2022-08-31 02:57:39
  • java实现点击按钮弹出新窗体功能

    2022-02-18 14:39:55
  • Android批量修改文件格式/文件名的神操作分享

    2022-07-13 00:31:53
  • Spring MVC基于注解的使用之JSON数据处理的方法

    2022-06-02 14:02:43
  • 详解xamarin Android 实现ListView万能适配器

    2022-11-26 02:12:33
  • C#中调用命令行cmd开启wifi热点的实例代码

    2023-11-28 03:15:04
  • c# list部分操作实现代码

    2021-09-25 03:43:19
  • 关于springboot2整合lettuce启动卡住问题的解决方法

    2022-08-24 09:29:16
  • asp之家 软件编程 m.aspxhome.com