Winform跨线程访问UI

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

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

解决方案

使用InvokeRequired属性判断是否线程安全。

            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.Invoke(new Action(() =>
               {
                   richTextBox1.AppendText(log);
                   richTextBox1.AppendText("\r\n");
               }));
            }
            else
            {
                richTextBox1.AppendText(log);
                richTextBox1.AppendText("\r\n");
            }

如果richTextBox1是在非主线程创建或找不到其句柄,那么richTextBox1.InvokeRequired=false返回false,就会走else分支,如果在找不到句柄的情况下,else里的代码也会抛异常。为了更加安全,需要进一步对句柄进行判断,用IsHandleCreated判断是否创建了句柄。

            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.Invoke(new Action(() =>
               {
                   richTextBox1.AppendText(log);
                   richTextBox1.AppendText("\r\n");
               }));
            }
            else
            {
                if (richTextBox1.IsHandleCreated)
                {
                    richTextBox1.AppendText(log);
                    richTextBox1.AppendText("\r\n");
                }

            }

上面代码基本上没什么问题了。但是稍显麻烦,可以进行精简一下。使用哦当前FormInvoke方法而不是具体某个ControlInvoke,这样能确保当前的操作一定在当前的UI线程中,且句柄一并被创建。

        private void Log(string log)
        {
            Invoke(new Action(() =>
            {
                richTextBox1.AppendText(log);
                richTextBox1.AppendText("\r\n");
            }));
        }

其实在winform中跨线程访问UI很常见,比如在一个子窗口中进行了某个操作,需要更新主窗口里的某些状态或数据,如果稍不注意就会出现跨线程访问UI的异常,因此Invoke方法应该被广泛使用。文章来源地址https://www.toymoban.com/news/detail-638480.html

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

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

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

相关文章

  • GitHub经常打不开或者访问解决办法

    访问慢或无法访问的原因:DNS解析是最为基础的一个环节。由于Github的服务器在全球各地,域名解析所需的时间也会不同,这就导致了在特定地区可能会出现Github无法正常访问的情况。 解决:查询到github对应的IP,然后在hosts中配置IP和域名的对应关系,就相当于告诉浏览器目

    2024年02月05日
    浏览(35)
  • 【JAVA开发面试】如何处理并发访问如何进行代码的单元测试Java多线程编程消息中间件设计模式技术难题是如何解决的

    【 点我-这里送书 】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明

    2024年02月03日
    浏览(39)
  • 前端开发过程中,经常遇到复制粘贴后自动空白一行,该如何解决这个问题哪?

    在前端开发中,我们经常会遇到复制粘贴的需求,不论是从其他地方复制代码还是从网上找到的资料,都需要进行粘贴操作。但是,在进行粘贴操作时,很容易出现一个问题:自动添加空白行。这种情况下,如果不处理,就会影响页面的美观和性能,甚至会导致代码无法正常

    2024年02月04日
    浏览(49)
  • 快速入门:【c# 之 Winform开发】

    在 winform 中,很多属性和方法的单词首字母都是要大写的,例如: Main() 方法。 在 WinForms 中,事件函数通常具有两个参数: object sender 和 EventArgs e 。 object sender :这个参数表示引发事件的对象。当事件被触发时,它指向引发事件的控件或对象。通过sender参数,你可以获得对触发

    2024年02月03日
    浏览(44)
  • 开发框架Furion之Winform+SqlSugar

    目录 1.开发环境 2.项目搭建 2.1 创建WinFrom主项目 2.2 创建子项目 2.3 实体类库基础类信息配置 2.3.1 Nuget包及项目引用 2.3.2 实体基类创建   2.4 仓储业务类库基础配置 2.4.1 Nuget包及项目引用 2.4.2 Dtos实体 2.4.3 仓储基类  2.5 service注册类库基础配置 2.5.1 config配置文件配置 2.5.2 Nug

    2023年04月26日
    浏览(73)
  • Winform/WPF利用CefSharp集成vue开发

    有时候因为各种原因,可能在开发winform或wpf项目的时候需要嵌入web项目,而目前vue在web开发中还是非常流行的,今天有空琢磨了一下怎么在winform中集成vue进行开发,当然,winform能实现,wpf也是一样的。 目前希望达到的效果是,能够在winform中显示web界面,并且能够与vue中的

    2024年02月08日
    浏览(31)
  • C#开发winform&wpf后台捕获鼠标移动事件

    做 WPF和winform的时候,可以在界面上设置鼠标移动事件来检测鼠标移动,如果项目为后期改造这样做的话改动量很大,今天通过另外一种后台调用windows api的方式进行快速捕获和触发,提高开发效率分享给大家。

    2024年02月16日
    浏览(36)
  • 在WInform开发中实现工具栏/菜单的动态呈现

    在Winform系统开发中,为了对系统的工具栏/菜单进行动态的控制,我们对系统的工具栏/菜单进行动态配置,这样可以把系统的功能弹性发挥到极致。通过动态工具栏/菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分配的方式,可以更有效的管理系统的菜

    2024年02月04日
    浏览(39)
  • 【WinForm.NET开发】设计具有更改通知的出色数据源

    简单绑定的更改通知 基于列表的绑定的更改通知 自定义控件的更改通知 应用 PropertyNameChanged 模式 实现 INotifyPropertyChanged 接口 同步绑定 Windows 窗体数据绑定最重要的概念之一是更改通知。 为确保数据源和绑定控件始终具有最新数据,必须为数据绑定添加更改通知。 具体来说

    2024年02月03日
    浏览(23)
  • Visual Studio C# WinForm开发入门(3):各种控件介绍

    窗口就是打开程序我们所面对的一个面板,里面可以添加各种控件,如下图所示,我们可以在属性栏设置其标题名称、图标、大小等。 双击标题框,会生成Load函数,也可以到事件里面去找 Load函数是窗口生成后需要执行的事件函数。 可以在里面加一些初始化函数。 (1)Na

    2024年02月09日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包