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线程的数据 ...
随机推荐
- JS预览图像
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- hadoop-cdh with snappy
hadoop: 2.5.0-cdh5.3.6 snappy: 1.1.3 hadoop 2.*不需要hadoop-snappy.只要机器上安装好snappy, 直接编译就可以 编译命令: mvn cl ...
- JSTL实现分页
JSTL(JSP Standard Tag Library ,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的.JSTL只能运行在支持JSP1. ...
- WPF socket通讯 UDP接收消息
客户端: private Socket socket; private IPEndPoint ipEndPoint; private void sendMessageHandler() { //服务端 ...
- Microsoft SqlServer2008技术内幕:T-Sql语言基础-读书笔记-单表查询SELECT语句元素
1.select语句逻辑处理顺序: FORM WHERE GROUP BY HAVING SELECT OVER DISTINCT TOP ORDER BY 总结: 2.FORM子句的表名称应该带上数 ...
- 调用微信退款接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...
- Postgres Basic Commands for Beginners
Just sharing what I have learned about postgres recently. Here is a part of basic commands you may n ...
- OpenGL 纹理贴图
前一节实例代码中有个贴图操作. 今天就简单说明一下纹理贴图... 为了使用纹理贴图.我们首先需要启用纹理贴图功能. 我们可以在Renderer实现的onSurfaceCreated中定义启用: // ...
- WIndows7 多版本
Windows7 安装U盘 删除source\ei.cfg 以后开机安装会提示安装的版本
- android-监听网络状态
1.注册一个广播接收器,监听网络状态private void Start() { IntentFilter filter = new IntentFilter(); filter.addAction( ...