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线程的数据 ...
随机推荐
- XP极限编程
13个核心实战 团队协作(Whole Team) 规划策略(The Planning Game) 软件发布计划(ReleasePlanning) 周期开发计划(IterationPlanning) ...
- eMarketer:DMP帮广告主搞定大数据处理问题
DMP(数据管理平台)帮助广告主获得可行动的洞察 在数字广告领域,大数据和数据管理平台(DPMs)仍大有可为.DMPs让广告主可以使用他们的大数据来做出更灵活更有效的营销决策. 数据管理和分析是业界挑 ...
- SBM is Not Sale And Run Company
data = """ Well,We will bet you dollars to donuts,there are so many crusher provider ...
- Java实现抽奖游戏
代码如下: import java.io.*; public class PresentDemo { /** * @param args */ public static void main(Stri ...
- GoogleMapApi 发布后提示安全问题
今天日本那边发过来一个Bug说是Google Map打不开,提示安全问题. 最后发现,日本那边的发布路径如下: https:xxxxx.gspserver.co.jp 而Source中Google M ...
- 04-树6 Complete Binary Search Tree
完全二叉树 刚开始只发现了中序遍历是从小到大顺序的.一直在找完全二叉树的层结点间规律...放弃了 不曾想,完全二叉树的规律早就知道啊.根结点为i,其左孩子结点2*i, 右孩子结点2*i+1. 结合此两 ...
- STM32F0xx_TIM输出PWM配置详细过程
前言 前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形.直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq ...
- python中列表和元组的使用方法和区别
一.二者区别 列表: 1.可以增加列表内容 append 2.可以统计某个列表段在整个列表中出现的次数 count 3.可以插入一个字符串,并把整个字符串的每个字母拆分当作一个列表段追加到列表 ...
- mysql基本知识---20151127-2
12.日期计算 YEAR( ).MONTH( )和DAYOFMONTH( ).CURDATE().RIGHT() 1>mysql> SELECT name, birth, CURDATE( ...
- SRF之权限控制
框架目前提供url访问.菜单和页面元素的权限控制和数据权限,权限基于角色来分配,1个用户可以属于多个角色,权限项分模块.页面.操作3级别,其中模块.页面用于url和菜单的控制,操作是对页面元素的控制. ...