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#程序设计有所帮助。


猜你喜欢
- 1. 需求描述有这样一个需求,用ViewPager实现图片滑动,其下方有一个tab,每一个tab的标签对应一组图片,在ViewPager中的
- 前言说实话,我在 * 工作的时候,就见过Gradle。但是当时我一直不知道这是什么东西。而且 * 工具组的工程师还将其和Android Stud
- 一、历史版本delegate void StudentDelegate(string name, int age);public class
- 本文实例分析了C#中float的取值范围和精度。分享给大家供大家参考。具体分析如下:float类型的表现形式:默认情况下,赋值运算符右侧的实
- 结构图: 抽象对象: abstract class Component  
- java中实现list或set转map的方法在开发中我们有时需要将list或set转换为map(比如对象属性中的唯一键作为map的key,对
- WPF中的ObservableCollection是一个非常常用的集合对象,我们可以通过将它绑定到ListBox之类的集合控件上时,当集合发
- Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样
- 本文实例讲述了Java swing框架实现的贪吃蛇游戏。分享给大家供大家参考,具体如下:java是门高级语言,做游戏时适合做后台,但是用它也
- 在同一个类中: 对于静态方法,其他的静态或非静态方法都可以直接调用它。而对于非静态方法,其他的非静态方法是可以直接调用它的。但是其他静态方法
- 本文实例讲述了Android编程之ActionBar Tabs用法。分享给大家供大家参考,具体如下:这里主要实现用Tab切换不同的Fragm
- using Microsoft.Win32 ; 1.读取指定名称的注册表的值 &nbs
- 前言在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并 * 况下使用HashMap
- 为了重用Fragment UI 组件,在设计中你应该通过定义每一个fragemnt自己的layout和行为,让fragment的自包含和模块
- 概述在使用Spring Boot的时候我们经常使用actuator,健康检查,bus中使用/refresh等。这里记录如何使用注解的方式自定
- 本文为大家分享了C#多线程之线程控制,供大家参考,具体内容如下方案一:调用线程控制方法.启动:Thread.Start();停止:Threa
- 一、什么是Spring Cloud?SpringCloud 对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性、可靠、协调的
- Socket里面的协议解析是Socket通讯程序设计中最复杂的地方,如果你的应用层协议设计或实现不佳,Socket通讯中常见的粘包,分包就难
- 先准备好一个新闻实体类package com.zb.fragmentbestpractice/** * title:表示新闻的实体类 * c
- 实现思路其实很简单,就是一个自定义的LinearLayout,并且textView能够循环垂直滚动,而且条目可以点击,显示区域最多显示2个条