最近又拿起了Winform的程序,由于要起socket server,所以需要起线程,这里就遇到了经典的跨线程UI调用的问题。

如果什么都不写,直接由线程更新UI,会报错:线程间操作无效

这里的解决方案一般有三种:

第一种,去掉主线程安全检查。这种方式非常不安全,可能引起崩溃,所以基本上不推荐这种方式:

 Control.CheckForIllegalCrossThreadCalls = false;

只需要加入这句话,直接在线程中更新UI也不会报错了。

第二种,使用invoke来处理,这种算是比较常见的用法。

this.textBox1.Invoke(new Action(() => {this.textBox1.Text = "test"}));

这样就可以了。

但是注意这种用法下可能产生控件已释放的问题。所以最好在处理之前先判断一下

while(!this.textBox1.IsHandleCreated)
{
if (textBox1.Disposing || textBox1.IsDisposed)
{
return;
}
}

这样就能保证不报错了。

第三种,使用同步上下文SynchronizationContext方法。获取主线程的上下文信息,然后使用Post或者Send方法发送。

private SynchronizationContext _synchronizationContext;
public Form1()
{
_synchronizationContext = SynchronizationContext.Current;
}

然后就可以使用

_synchronizationContext.Post

来发送内容了

Winform解决跨线程更新UI的问题的更多相关文章

  1. Winform之跨线程更新UI

    Winform之跨线程更新UI 使用`Invoke`或者`BeginInvoke`与UI线程交互示例 参考及源码 使用Invoke或者BeginInvoke与UI线程交互示例 private void ...

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

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

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

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

  4. (转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例

    http://2sharings.com/2014/net-4-5-task-run-parallel-for-winform-cross-multiple-threads-update-ui-dem ...

  5. 简短总结一下C#里跨线程更新UI(转)

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  6. 简短总结一下C#里跨线程更新UI

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  7. C# 跨线程更新 UI

    Winforms 跨线程更新 UI 在 Winforms 中, 所有的控件都包含 InvokeRequired 属性, 如果我们要更新UI,通过它我们可以判断是否需要调用 [Begin]Invoke. ...

  8. C# WinForms跨线程更新 UI

    与在Android中一样, 子线程中更新UI被认为是线程不安全的, 会抛出异常. 子线程返回UI线程中更新UI的一个方法为: 1, 捕获应用的UI线程的上下文; 2, 定义线程任务; 3, 定义线程任 ...

  9. C#利用委托跨线程更新UI数据

    转:http://www.2cto.com/kf/201206/136587.html 在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面 ...

  10. 理解SynchronizationContext,如何在Winform里面跨线程访问UI控件

    SynchronizationContext 类是一个基类,可提供不带同步的自由线程上下文. 此类实现的同步模型的目的是使公共语言运行库内部的异步/同步操作能够针对不同的异步模型采取正确的行为.此模型 ...

随机推荐

  1. Mmdetection dataset pipline

    数据的加载顺序是上图(来自mmdetection官网)中的顺序进行,上图中只有一次padding,但是其实dataloader一共有两次padding,一次是pad,另外一次就是collect后,给模 ...

  2. webpack笔记-webpack之模块module、路径解析、resolve 配置(三)

    module webpack 的初衷是让 js 支持模块化管理,并且将前端中的各种资源都纳入到对应的模块管理中来,所以在 webpack 的设计中,最重要的部分就是管理模块和模块之间的关系. 在 we ...

  3. Maven高级——继承与聚合

    继承与聚合 聚合 聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合 聚合工程:通常是一个不具有业务功能的"空"工程(有且仅有一个pom文件) 作用:使用聚合工程可以将 ...

  4. MyBatis——案例——查询-单条件查询-动态条件查询

    单条件查询-动态条件查询(choose(when,otherwise))      从多个条件中选择一个   choose(when,otherwise) 选择,类似于java中的Switch语句(w ...

  5. 单片机-XIP-外部闪存就地执行代码

    声明:此博文所述我未实践,目的是知识整理. 1.  常说的 "单片机的norflash上可以执行代码 " 这句话该如何理解? CPU做取指.译码.执行. 常说的哪些介质可以执行程序 ...

  6. 数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪

    数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪 随着全球对可持续发展和产品透明度的关注日益增加,企业需要一种可靠的方法来跟踪和管理产品生命周期中的关键数据.我们 ...

  7. 《Neo4j 图数据库扩展指南:APOC和ALGO》

    https://detail.tmall.com/item.htm?spm=a2e2i.11532906.0.d2960ced2.f27a6abbrEMtHp&id=622478213458 ...

  8. C++第六节课 引用变量 指针的升级版

    #include <iostream> using namespace std; // C++的引用 是C指针的升级 可以提高代码的稳定性和健壮性 // const 修饰的引用 是 常引用 ...

  9. 第三方的开源库FluentVaidation校验字段的

    内置的 using System.ComponentModel.DataAnnotations; 基本使用: 1. 安装包 FluentValidation.AspNetCOre 2. 注册服务 bu ...

  10. excel导出功能的实现流程说⼀下?

    导出的话,我们因为到处的数据量不⼤,所以直接采取的时候前端主导的⽅案,参考的现成⽅案实现的 导出 ⼤概得流程就是 1. 调⽤后端接⼝得到要导出的数据 2. 把数据简单处理⼀下转化成导出插件需要的格式 ...