c# 跨线程访问UI控件

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

        在一个应用程序中,往往存在两种线程:UI线程和工作线程。

        UI线程有窗口,创建窗口的控件,且有消息队列对窗口和控件的消息进行管理。主要处理和UI相关的逻辑。

        工作线程主要处理和业务相关的比较复杂的逻辑,当处理好之后有可能会调用UI线程中的控  件将结果在UI界面上展现出来。

         那么到这里,就出现了跨线程调用UI控件方法的问题。在工作线程中可以直接调用UI上的控件的方法吗?显然不行。代码能编译,在运行时会报错。

          怎么解决这个问题呢?

          每个控件都有一个属性:InvokeRequired,该属性值为true的场合,表示:调用方是跨线程调用该控件,那么就需要调用该控件的invoke方法执行相关方法来实现逻辑。该属性值为false的场合,表示调用方为UI线程,那么可以直接调用控件方法或者改变该控件的属性值。

例:

            
            if (textBox.InvokeRequired)
            {
                textBox.Invoke(new Action<string>(str =>
                {
                    textBox.Text += str;
                }), logStr);
            }
            else
            {
                textBox.Text += logStr;
            }

         文章来源地址https://www.toymoban.com/news/detail-717178.html

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

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

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

相关文章

  • Winform UI界面设计例程——多线程访问UI控件

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

    2023年04月08日
    浏览(37)
  • C#线程间操作无效:从不是创建控件“textbox1”的线程访问它

    在C#的多线程访问中,在线程间的相互访问时因为线程安全问题有访问限制,在创建一般线程时,对于界面元素访问时这样的问题比较常见。 比如,创建一个form1,上面放置一个textbox控件,创建一个线程去访问textbox,界面如下: 按钮buuton1的代码: 就是简单地创建一个线程,

    2023年04月09日
    浏览(40)
  • C# 解决 System.InvalidOperationException:“线程间操作无效: 从不是创建控件“...”的线程访问它。”

    方法1(不推荐):禁用跨线程检查 使用 Control.CheckForIllegalCrossThreadCalls = false; 例如: 方法2:使用委托 使用 Control 基类的 Invoke 或 BeginInvoke 方法,来执行禁止跨线程的代码。 例如: 或: 使用参数进行传递: 不使用 lambda 表达式的写法: 使用 BeginInvoke 方法的情形,与使用

    2024年02月12日
    浏览(50)
  • C#针对VS线程间操作提示:程间操作无效: 从不是创建控件“”的线程访问它的几种解决方法

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

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

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

    2024年02月09日
    浏览(59)
  • Qt子线程控制主界面UI控件

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

    2024年02月15日
    浏览(48)
  • Winform跨线程访问UI

    在开发 winfrom 应用时,经常遇到异常: System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxxx”的线程访问它。 出现这个异常的原因是创建这个UI的线程,和当前访问这个UI的线程不会是同一个。Winform为了防止线程不安全,因此对这个跨线程访问抛出异常,禁止这

    2024年02月13日
    浏览(34)
  • C# Task Parallel Library (TPL) 访问线程池

    //在C#中,可以使用Task Parallel Library (TPL)来访问线程池。 //TPL是一个用于并行编程的框架,它提供了一种简单的方式来创建并行任务, //并 自动利用线程池 来执行这些任务。 //下面是一个使用TPL访问线程池的示例: //csharp using System; using System.Threading.Tasks; class Program {     st

    2024年02月08日
    浏览(79)
  • 安卓在子线程中实现更新UI界面的三种方法 Handler+Message、runOnUiThread、控件.post()

    1.说明 安卓中UI线程为主线程,更新UI界面必须在主线程中进行,在子线程中实现更新UI界面的三种方法:Handler、RunOnUiThread、控件.post() 2.1 Handler (1)定义handler (2)使用 2.2 控件.post() 2.3 在子线程中使用 runOnUiThread

    2024年02月12日
    浏览(46)
  • WPF跨线程访问UI对象之Dispatcher的用法(含Task)

    WPF程序员处理多线程的一个方式 - Dispatcher 当我们打开一个WPF应用程序即开启了一个进程,该进程中至少包含两个线程。 一个线程用于处理呈现:隐藏在后台运行 一个线程用于管理用户界面:接收输入、处理事件、绘制屏幕以及运行应用程序代码。即UI线程。 在UI线程中有一

    2024年02月16日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包