分享一段“在.net的多线程中更新任意为Control类型的控件”解决窗体假死问题,调用极其简洁和方便~~~

wtoeb 2015-12-28 10:46:56
加精
众所周知,在.net的多线程中更新界面时很容易假死,如果界面上有100个控件,那代码量又是相当的复杂,现提供一段简单的代码,可以用于线程代码的任意位置,而界面又不会假死。总之是一行代码,解决了一个复杂而又麻烦的大问题,让你完全不用考虑多线程下对控件的处理,直接调用就好了。
1、适用范围:
任意Control类型的控件。
2、调用
this.Label1.InvokeEx(e => e.Text = DateTime.Now);

3、代码
public static void InvokeEx<T>(this T @this, Action<T> action) where T : Control
{
if (@this.InvokeRequired)
@this.Invoke(action, new object[] { @this });
else
{
if (!@this.IsHandleCreated)
return;
if (@this.IsDisposed)
throw new ObjectDisposedException("@this is disposed.");
action(@this);
}
}
public static IAsyncResult BeginInvokeEx<T>(this T @this, Action<T> action) where T : Control
{
return @this.BeginInvoke((Action)delegate { @this.InvokeEx(action); });
}
public static void EndInvokeEx<T>(this T @this, IAsyncResult result) where T : Control
{
@this.EndInvoke(result);
}
...全文
2301 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
njit_77 2017-04-13
  • 打赏
  • 举报
回复
赞分享精神。
qq_38107169 2017-03-29
  • 打赏
  • 举报
回复
666666666666
  • 打赏
  • 举报
回复
强力支持!
sinat_38090366 2017-03-28
  • 打赏
  • 举报
回复
赞楼主的分享精神
seamanic 2016-01-04
  • 打赏
  • 举报
回复
橘子皮... 2016-01-03
  • 打赏
  • 举报
回复
this.Label1.InvokeEx(e => e.Text = DateTime.Now); 里的e是什么东东
Tobin_han 2016-01-03
  • 打赏
  • 举报
回复
麻烦问一下楼主解决窗体假死问题可以弹窗显示进度条吗?如何做呢?不好意思,麻烦了。
衣舞晨风 2016-01-03
  • 打赏
  • 举报
回复
hwyqy 2016-01-02
  • 打赏
  • 举报
回复
虽然是个简单的封装,但也赞一个
泡泡龙 2016-01-01
  • 打赏
  • 举报
回复
支持一下 ,点个赞
有时想起 2015-12-31
  • 打赏
  • 举报
回复
this.Label1.Invoke(new Action() => {this.Label1.Text = DateTime.Now);
编程有钱人了 2015-12-30
  • 打赏
  • 举报
回复
赞一个
knf 2015-12-30
  • 打赏
  • 举报
回复
有个问题一直没弄明白,如果跨线程读取控件的值需不需要invoke,测试时好像不用invoke读取值不会报错。
猴头 2015-12-30
  • 打赏
  • 举报
回复
引用 4 楼 u012948520 的回复:
[quote=引用 3 楼 diaodiaop 的回复:] 对啊对啊... 我都是直接.

 lab_tip4.BeginInvoke(new Action(() =>
            {
                lab_tip4.ForeColor = System.Drawing.Color.Green;
            }));
好像跟你"封装"后的差不多嘛.....
begininvoke和invoke有什么区别吧?我一般用的是this.Invoke((Action)delegate{});[/quote] BeginInvoke 是 一步操作,相当于一个后台线程 执行 制定的委托
MR00009 2015-12-29
  • 打赏
  • 举报
回复
赞分享精神! .Net 4.5 后,可以简化成:

 label.Dispatcher.Invoke(() =>{ label.Content = DateTime.Now; });
qq570405090 2015-12-29
  • 打赏
  • 举报
回复
不错哈!!!!!!!!!!!!!!!!!!!
业余草 2015-12-29
  • 打赏
  • 举报
回复
exception92 2015-12-29
  • 打赏
  • 举报
回复
大赞!!!!!!!!!!!!
BitCoffee 2015-12-29
  • 打赏
  • 举报
回复
白衣如花 2015-12-29
  • 打赏
  • 举报
回复
引用 3 楼 diaodiaop 的回复:
对啊对啊... 我都是直接.

 lab_tip4.BeginInvoke(new Action(() =>
            {
                lab_tip4.ForeColor = System.Drawing.Color.Green;
            }));
好像跟你"封装"后的差不多嘛.....
begininvoke和invoke有什么区别吧?我一般用的是this.Invoke((Action)delegate{});
加载更多回复(7)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧