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线程的数据 ...
随机推荐
- Uva 1588 Kickdown
这道题思路并不难想,在做题过程中主要遇到的困难有: 因为没有仔细的考虑边界情况,没有分析全面,导致因=没有取到而得不出正确结果,浪费的大量时间. 今后在做这类题目时,一定要先进行一个比较全面的分析+模 ...
- compareTo & toString
public class UnAssignedRecord implements Comparable<UnAssignedRecord> { private String time; / ...
- luigi学习1
一.luigi介绍 luigi是基于python语言的,可帮助建立复杂流式批处理任务管理系统.这些批处理作业典型的有hadoop job,数据库数据的导入与导出,或者是机器学习算法等等. luigi的 ...
- [原]Python Web部署方式总结
不要让服务器裸奔 学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服 ...
- Ubuntu12.04卡死的解决方案
刚开始安装的时候用着还行,不过后来发现用了一会总是会出现卡死的状况 后来看了下ubuntu12.04的内核是3.2,后来把内核升级到3.5发现这种情况不会出现了. 查看内核以及升级内核 uname - ...
- linux下的循环命令写法
直切正题 方法一:利用while do循环,举例,while true;do ls;sleep 1;done 解释,该命令为每秒执行ls查询命令,sleep 1 为每秒循环,其他命令可直接替换 ls ...
- Tomcat工作原理
http://www.cnblogs.com/shootercheng/p/5838645.html
- xtrabackup之Innobackupex全备数据库
一.Xtrabackup是什么: Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品. ...
- 第三章 管理程序流(In .net4.5) 之 实现程序流
1. 概述 本章内容包括 布尔表达式.流控制方式.集合遍历 以及 流跳转. 2. 主要内容 *由于该章内容比较基础,日常用的也很多,故对一些常用的基础内容不再赘述. 2.1 使用布尔表达式 熟悉下列比 ...
- mamp pro
MAMP PRO Settings and Files /Library/Application Support/appsolute/MAMP PRO ~/Library/Application Su ...