C#线程操作UI控件

这篇具有很好参考价值的文章主要介绍了C#线程操作UI控件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在写winform程序时候,如果时间长的操作不用线程操作。那么会卡死UI,点击界面就体现为未响应。为此需要对耗时操作用线程处理,比如检验的监听程序就是一个死循环,不停检查文件夹或数据库又没有数据,然后上传。如果不时有线程,在数据多的情况,程序是基本点不动的,这样体验就很不好。

1.首先拖个文本框准备用线程给里面写文本
c# ui,C#,c#,ui,开发语言

2.测试代码,创建一个线程,直接操作UI控件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace ThreadUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 加载方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            //用线程写文本
            Thread t = new Thread(WriteTxt);
            t.Start();

        }

        /// <summary>
        /// 写文本
        /// </summary>
        public void WriteTxt()
        {
            for(int i=0;i<100;i++)
            {
                richTextBox1.Text += "第" + i + "行\n";
            }

        }

    }
}

3.运行报错,这里报错不能从线程访问UI控件
c# ui,C#,c#,ui,开发语言

那么对于线程运行长时间操作,想和UI交互怎么办呢?

这里需要用委托解决线程和UI交互:
1.先定义一个委托
2.把操作UI的方法再用委托包一层
3.线程调用包装的方法

调整代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace ThreadUI
{
    /// <summary>
    /// 写日志委托
    /// </summary>
    /// <param name="info"></param>
    public delegate void WriteInfoDelegate(string info);

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 加载方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            //用线程写文本
            Thread t = new Thread(WriteTxt);
            t.Start();

        }

        /// <summary>
        /// 写日志代理方法
        /// </summary>
        /// <param name="info"></param>
        public void WriteInfoProxy(string info)
        {
            //组装参数
            object[] paras = new object[] { info };
            //在UI线程执行委托
            this.Invoke(new WriteInfoDelegate(SetTxt), paras);
        }

        /// <summary>
        /// 操作控件逻辑
        /// </summary>
        /// <param name="info"></param>
        public void SetTxt(string info)
        {
            richTextBox1.Text += info;
        }

        /// <summary>
        /// 写文本
        /// </summary>
        public void WriteTxt()
        {
            for(int i=0;i<100;i++)
            {
                WriteInfoProxy("第" + i + "行\n");
            }

        }

    }
}

就不会异常了
c# ui,C#,c#,ui,开发语言

C#的委托我理解为函数指针,和C及C++里的指针不同的是他类型化更明显了。什么类型的委托可以初始化什么类型的方法委托变量。这样就可以把函数指针到处传递了。在子弹窗触发父窗体刷新等也基于委托调用也是一个很好的方式。千万别到父页面搞个静态方法这种方式给子页面调额。这种太死了,借助委托可以把方法层层传递给任何要调用的地方。

iMedicalLIS监听程序的基础就基于线程和委托来实现异步,防止卡UI。文章来源地址https://www.toymoban.com/news/detail-537040.html

到了这里,关于C#线程操作UI控件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#针对VS线程间操作提示:程间操作无效: 从不是创建控件“”的线程访问它的几种解决方法

    转载请标明出处:Python Excellent的博客 此为最基础方法 (入门级) 运行效果如图所示 * 先在按钮事件中创建一个Test1()线程 * 在测试1中有两种方法可以访问窗体线程(首推荐) public SynchronizationContext UiContext //第一步全局声明 UiContext = SynchronizationContext.Current; //第二部在public For

    2024年02月08日
    浏览(42)
  • QT子线程或自定义类操作访问主界面UI控件的几种方法

            QT创建窗体工程,一般在MainWindow或Dialog类里可以直接通过ui指针访问控件,但是添加新的类后又如何访问呢,可以通过以下几种方式: (1)例如有个自己定义的类CustomClass,在自定义类里包含主界面指针MainWindow * class MainWindow;   class CustomClass { public:     CustomCla

    2024年02月09日
    浏览(55)
  • C# 计时器(Timer )WPF窗体出现“System.InvalidOperationException:“调用线程必须为 STA,因为许多 UI 组件都需要。””

    大家在WPF窗体使用计时器(Timer)的时候可能会出现一个这样的错误“System.InvalidOperationException:“调用线程必须为 STA,因为许多 UI 组件都需要。””,这个错误一般都是线程的问题,我们可以使用另一种计时器(DispatcherTimer)来避免发生这种问题。 以上就是解决Timer计时器出

    2024年02月04日
    浏览(52)
  • C#自动化采集工具-1.采集布局设计与UI开发框架

    这里UI我们用.NET中较为容易上手的winform来开发,如图,因为对于工具的界面并没有太多花哨的需求,满足使用即可。界面上方是导入导出等一系列全局操作功能,中间是配置信息,下方是日志控制台,中间配置信息又分为左右,左边是树形采集列表,右边是点击列表节点对应

    2023年04月15日
    浏览(39)
  • UG NX二次开发(C#)-UI Styler-批量选择点

    在设计UG NX的对话框界面时,有时需要选择点,在UI Styler编辑器中已经设置好了可以指定点选择按钮,这个点选择对话框是单选,不是多选的,如果想选择多个点,那么可以采用对象选择按钮,本文介绍下选择点的操作。 UG NX的UI Styler对话框中,指定点如下图所示: 添加此按

    2023年04月16日
    浏览(50)
  • C# 跨线程访问窗体控件

    在不加任何修饰的情况下,C# 默认不允许跨线程访问控件,实际在项目开发过程中,经常使用跨线程操作控件属性,需要设置相关属性才能正确使用,两种方法设置如下: 方法1:告诉编译器取消跨线程访问检查,在窗体构造函数中编写,如下图所示: 方法2:设置所需的控件

    2024年02月11日
    浏览(56)
  • C# WinForm 跨线程访问控件

    在WinForm开发中,经常会碰到主线程代码运行过程中需要刷新窗体控件的情况,如果直接在其他线程中去操作窗体控件,这时会抛出线程间操作无效的异常信息,因为窗体控件是由主线程创建的,C#强制要求代码必须是线程安全的,所以不允许跨线程访问。需要使用控件的Inv

    2024年02月04日
    浏览(39)
  • Winform UI界面设计例程——多线程访问UI控件

    这里讨论两种多线程访问UI控件的方法,线程完成后更新Lable控件 如下图,第一种方式为方式1按钮按下,线程运行,并更新label 第二种方法为按下方式2按钮,线程运行,完成后更新label  新建winform项目程序,布局如上,大家可以不用配色,简单即可 引用 using System.Threading;  

    2023年04月08日
    浏览(36)
  • Qt子线程控制主界面UI控件

    在子线程里控制主界面的UI控件有两种方法:第一种是在子线程中发送信号,然后在主线程中去更新;第二种方法是在子线程中创建同样的对象,然后把主界面中控件的指针赋给创建的对象。 第一种方法在此不做实例展示,在此通过一个简单的例子展示第二种方法: 下面是主

    2024年02月15日
    浏览(47)
  • C#——表格开发之DataGridView控件

    目录 一、概要 二、手动填充数据 1、如何手动填充数据 2、如何插入一行数据 3、如何修改单元格值 三、DataGridView控件绑定数据源 1、概述 2、将DataGridView绑定到BindingSource 使用DataGridView控件,您可以显示和编辑来自许多不同类型数据源的表格数据。 DataGridView控件为显示数据提

    2024年02月03日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包