在开发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方法应该被广泛使用。

Winform跨线程访问UI的更多相关文章

  1. WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )

    WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...

  2. C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它

    C# 委托 / 跨线程访问UI /  线程间操作无效: 从不是创建控件“Form1”的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 using System; ...

  3. 跨线程访问UI控件时的Lambda表达式

    工作中经常会用到跨线程访问UI控件的情况,由于.net本身机制,是不允许在非UI线程访问UI控件的,实际上跨线程访问UI控件还是 将访问UI的操作交给UI线程来处理的, 利用Control.Invok ...

  4. C# 跨线程访问UI不报错,必须使用Invoke。

    代码有时跨线程访问UI,修改按钮Enable属性不报异常.调试发现修改按钮属性的线程是Background,执行不报异常. 在窗体构造中添加 Control.CheckForIllegalCrossT ...

  5. .NET设计篇08-线程统一取消模型和跨线程访问UI

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂,输出倒逼输入 内容目录 一.线程统一取消模型1.取消令牌2.可以中断的线程1.设计一个中断函数2.创建CancellationTokenSour ...

  6. .NET设计篇08-线程取消模型和跨线程访问UI

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂,输出倒逼输入 内容目录 一.线程统一取消模型1.取消令牌2.可以中断的线程1.设计一个中断函数2.创建CancellationTokenSour ...

  7. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...

  8. C# Winform 跨线程更新UI控件常用方法总结(转)

    出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件 ...

  9. C#-WinForm跨线程修改UI界面

    待解决的问题 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作.他们会引发软件的卡顿甚至假死,严重影响软件的使用. 因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程( ...

  10. C# WinForm 跨线程访问控件

    问题出现: 在WinForm 处理多线程访问主线程的控件时候,就会出现如图所示的错误对话框:    解决方案:  方案一:去掉线程访问主线程UI控件的安全检查,使用: Control.CheckFor ...

随机推荐

  1. JavaFx 关键字高亮文本实现

    原文地址:JavaFx 关键字高亮文本实现 - Stars-One的杂货小窝 整蓝奏云批量下载器里的搜索功能想到的一个关键字高亮功能,借助textflow组件来实现,记录一下 本文基于TornadoF ...

  2. 2022-12-03:部门工资最高的员工。以下数据Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。sql语句如何写? 输出结果如下: department emp

    2022-12-03:部门工资最高的员工.以下数据Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高.sql语句如何写? 输出结果如下: department empl ...

  3. 2020-09-11:Hive的优化策略有哪些?

    福哥答案2020-09-11: [Hive调优及优化的12种方式](https://zhuanlan.zhihu.com/p/80718835?utm_source=qq)1.请慎重使用COUNT(D ...

  4. 2022-05-11:k8s安装easydarwin流媒体服务器,yaml如何写?

    2022-05-11:k8s安装easydarwin流媒体服务器,yaml如何写? 答案2022-05-11: yaml如下: apiVersion: apps/v1 kind: Deployment ...

  5. java中this的内存原理以及成员变量和局部变量

    this的内存原理 1.this的作用: 区分局部变量和成员变量 eg: public class Student{ private int age; public void method(){ in ...

  6. 【Qt 6】读写剪贴板

    剪贴板是个啥就不用多介绍了,最直观的功能是实现应用程序之间数据共享.就是咱们常说的"复制"."粘贴"功能. 在 Qt 中,QClipboard 类提供了相关 A ...

  7. [MAUI程序设计]界面多态与实现

    目录 需求一:在不同设备上使用不同 UI 外观 定义控件 UI 外观 基于平台自定义配置 需求二:在不同数据类别中使用不同的 UI 外观 定义视图 UI 外观 创建数据模板 创建选择器 定义数据 需求 ...

  8. 2021年蓝桥杯C/C++大学B组省赛真题(路径)

    题目描述: 小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径. 小蓝的图由2021 个结点组成,依次编号1 至2021. 对于两个不同的结点a, b,如果a 和b 的差的绝 ...

  9. 基于AIGC的京东购物助手的技术方案设想

    灵感来源 随着AIGC的爆火,ChatGPT,GPT-4的发布,我作为一个算法工作者,深感AI发展的迅猛.最近,OpenAI的插件和联网功能陆续向用户公开,我也在第一时间试用了这些最新的功能.在Ope ...

  10. JSON第二

    HTML DOM 节点在 HTML DOM 中,所有事物都是节点.DOM 是被视为节点树的 HTML. TML 文档中的所有内容都是节点:整个文档是一个文档节点每个 HTML 元素是元素节点HTML ...