避免InvokeRequired(1)

 第一次翻译技术性的文章,英语没过四级,还请大家轻点拍,不要人生攻击就好!

 

原文:http://www.codeproject.com/KB/cs/AvoidingInvokeRequired.aspx

 
 

下载源代码:Download source - 28.07 KB

wps_clip_image-108

引子

如你所知,当你需要从多线程中访问用户界面是,使用Windows.Forms变得十分可恶。如我拙见,这有一个leaky abstraction的例子。我不知道,我也不想知道为什么不能这样简单的写:

 
 

在任何线程中,对于线程问题 Windows.Forms.Control class 应该是抽象的。但是它没有!我将展示这个问题的几种解决办法,最终是我找到的最简单的解决办法。Wait till the end to find the good stuff (or click here)!

有一件事需要清楚——当你在Visual Studio中运行一个带UI线程的程序时,总是会抛出一个异常。而同样的程序作为一个单独的EXE运行时可能不会抛出异常。也就是说,开发环境比 .NET framework更为严格。这其实是一件好事,在开发阶段就解决问题比在生产中出现不可控制的问题要好的多。

这是我在这(CodeProject)的第一篇文章,而且英语并不是我的母语,所以请大家轻点拍!

public delegate void DelegateStandardPattern();
private void SetTextStandardPattern()
{
if (this.InvokeRequired)
{
this.Invoke(new DelegateStandardPattern(SetTextStandardPattern));
return;
}
this.text = "New Text";
}

这种解决办法的优点是:

  • 它确实有效
  • 它能适用于C# 1.0, 2.0, 3.0, 3.5, Standard and Compact Framework(从CF 1.1开始,在CF 1.0中不是必须用InvokeRequired)。
  • 每个人都用它,所以当你读到和这类似的代码时,你知道这些代码大致可以在其他线程中去调用。

其缺点是:

  • 仅仅是更新一个Text却需要大量的代码!
  • 你需要去复制/粘贴这段代码,却不能用一个通用的方法去表示。
  • 如果你需要去调用一个带参数的方法,你不能重用这个委托(delegate)。不同的参数类型,你需要声明不同的委托(delegate)。
  • 这种办法很难看(ugly)。我知道这种感觉很主观,但是它确实是这样的。我特别厌烦在一个方法(method)的外面声明一个委托(delegate)。

其实有很多很聪明的解决办法,像this one using AOP,还有this one using Reflection。但是我想更简便的去实现它。一种办法是SurroundWith code snippet, 但是我希望我的代码是从程序语言上去解决他,而不是用IDE的方式。同样,它只是解决了复制/粘贴的问题(见上述缺点第二条),仍然需要很多代码去解决像这样简单的问题(缺点第一条)。

为什么我们不能推广这种标准模式呢?因为在.NET 1.0中没有办法将一段代码作为参数传递,因为当C#刚诞生时,几乎是不支持函数式的编程风格。

转载于:https://www.cnblogs.com/fangfan4060/archive/2009/07/16/1525158.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值