Winform跨线程操作界面的策略
BeginInvoke(new ThreadStart(() => toolStripButton1.Text = "aaa"));
1、非跨线程操作和部分跨线程get不会引发异常;
2、跨线程set,见上面的例子。
3、部分跨线程get,见下面的例子。
var a = (int)EndInvoke(BeginInvoke(new Func<int>(() => toolStripComboBox1.SelectedIndex)));
public static class UIInvokeHelper
{
public static void InvokeUI(this Form form, Action action)
{
if (form == null)
{
throw new ArgumentNullException("form");
}
if (action == null)
{
throw new ArgumentNullException("action");
}
if (form.InvokeRequired)
{
form.Invoke(new Action(action), null);
}
else
{
action();
}
}
public static T InvokeUI<T>(this Form form, Func<T> func)
{
if (form == null)
{
throw new ArgumentNullException("form");
}
if (func == null)
{
throw new ArgumentNullException("func");
}
if (form.InvokeRequired)
{
return (T)form.Invoke(new Func<T>(func));
}
return func();
}
}
public static class UIInvokeHelper
{
/// <summary>
/// 适用于非耗时、无返回值的跨线程界面操作。
/// </summary>
/// <param name="form"></param>
/// <param name="action"></param>
public static void InvokeUI(this Form form, Action action)
{
if (form == null)
{
throw new ArgumentNullException("form");
}
if (action == null)
{
throw new ArgumentNullException("action");
}
if (form.InvokeRequired)
{
form.Invoke(new Action(action));
}
else
{
action();
}
}
/// <summary>
/// 适用于有返回值的跨线程界面操作。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="form"></param>
/// <param name="func"></param>
/// <returns></returns>
public static T InvokeUI<T>(this Form form, Func<T> func)
{
if (form == null)
{
throw new ArgumentNullException("form");
}
if (func == null)
{
throw new ArgumentNullException("func");
}
if (form.InvokeRequired)
{
return (T)form.Invoke(new Func<T>(func));
}
return func();
}
/// <summary>
/// 适用于耗时、无返回值的跨线程界面操作。
/// </summary>
/// <param name="form"></param>
/// <param name="action"></param>
public static void BeginInvokeUI(this Form form, Action action)
{
if (form == null)
{
throw new ArgumentNullException("form");
}
if (action == null)
{
throw new ArgumentNullException("action");
}
if (form.InvokeRequired)
{
form.BeginInvoke(new Action(action));
}
else
{
Task.Factory.StartNew(action);
}
}
}
Winform跨线程操作界面的策略的更多相关文章
- 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常
在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...
- winform 跨线程操作控件
当进行winform的开发时,经常遇到用时比较久的操作,在传统的单线程程序中,用户必须等待这个耗时操作完成以后才能进行下一步的操作,这个时候,多线程编程就派上用场了,将这个耗时的操作放到一个新的子线程 ...
- C# winform 跨线程修改界面
我们可以使用invoke和bengininvoke invoke同步执行一个委托 begininvoke异步执行一个委托
- [WinForm]WinForm跨线程UI操作常用控件类大全
前言 在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作.不过会有一个问题:就是涉及到跨线程操作UI元素. 相信才开始接触的人一定会遇上这个问题. 为了解决这个问 ...
- WinForm中新开一个线程操作 窗体上的控件(跨线程操作控件)
最近在做一个winform的小软件(抢票的...).登录窗体要从远程web页面获取一些数据,为了不阻塞登录窗体的显示,开了一个线程去加载数据远程的数据,会报一个错误"线程间操作无效: 从不是 ...
- WinForm中跨线程操作控件
在WinForm编程时会遇到通过后台线程操作界面的情况,直接在后台线程执行的方法中直接操作控件会报错,这时候就要使用跨线程方式间接操作控件.下面是两种实现方式. 1.采用定义delegate的方式 ...
- C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...
- C# Winform 跨线程更新UI控件常用方法总结(转)
出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件 ...
- WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )
WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...
随机推荐
- GemFire 入门篇1:GemFire 是什么?
一.GemFire是什么? 如果你了解Redis或memCached,那么恭喜,你很快就能理解GemFire是什么,没错,你可以把它理解为一个增强版的Redis,具体在哪些方面增强,我们日后慢慢聊 ...
- onMeasure 出现java.lang.NullPointerException
直接在xml中使用自定义的布局.如自定义了一个view的onMeasure方法,如果此时引用Application就容易发生NullPointExecption异常.
- 【推介】GitHub
隆重推介:GitHub(https://github.com/) 作为开源代码库以及版本控制系统,Github拥有140多万开发者用户. 随着越来越多的应用程序转移到了云上,Github已经成为了管理 ...
- GetType() 和typeof() 的区别
GetType() 非强类型,支持跨程序集发射,用来支持动态引用, A obja=new A(); Type t=obja.GetType() typeof() 强类型,静态的 Type t=type ...
- 02-线性结构3 Pop Sequence
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p ...
- tomcat datasource
<Resource name="jdbc/xxx" auth="Container" type="javax.sql.DataSource&qu ...
- Moses manual 中Basline System 2.3.4节用IRSTLM创建语言模型的命令有误
手册里写到: ~/irstlm/bin/compile-lm \ --text yes \ news-commentary-v8.fr-en.lm.en.gz \ news-commentary-v8 ...
- mq消息队列
rabbitmq学习9:使用spring-amqp发送消息及同步接收消息 通过对spring-amqp看重要类的认识,下面来通过spring-amqp的发送消息及同步接收消息是如何实现的.有兴趣的朋友 ...
- .NET开源工作流RoadFlow-系统布署及注意事项
非常感谢您在百忙之中抽空来了解RoadFlow,下面我们说一下如果在自己本地搭建环境吧. 1.环境要求 数据库:sqlserver2005以上版本.服务器:IIS6.0以上,或iisexpress.d ...
- Oracle数据迁移至MySQL
ORACLE DB: 11.2.0.3.0 MYSQL DB: 5.5.14 因项目需求,需要将ORACLE生产中数据迁移至MYSQL数据库中作为初始数据,方法有如下几种: 1.ORACLE OGG ...