【转】Silverlight与WPF中BeginInvoke的差异
来源:互联网 发布:mac版本老装不了xcode 编辑:程序博客网 时间:2024/05/18 11:35
Silverlight/WPF中,如果要在多线程中对界面控件值做修改,用Dispatcher对象的BeginInvoke方法无疑是最方便的办法,见:温故而知新:WinForm/Silverlight多线程编程中如何更新UI控件的值
但今天发现WPF中的BeginInvoke却无法自动将匿名方法/Lambda表达式转变成Delegate类型(注:对委托,匿名方法,Lambda感到陌生的朋友先阅读温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件)
silverlight中的代码片段:
private void button1_Click(object sender, RoutedEventArgs e){ Thread t = new Thread(TestMethod); t.Start(); Thread t2 = new Thread(TestMethod2); t2.Start("Hello World");} void TestMethod() { this.Dispatcher.BeginInvoke(() => { this.textBlock1.Text = DateTime.Now.ToString("HH:mm:ss"); }); } void TestMethod2(object s){ this.Dispatcher.BeginInvoke(() => { this.textBlock1.Text =s.ToString() ; });}
WPF中如果这样用,会报如下错误:
Cannotconvert lambda expression to type 'System.Delegate' because it is not adelegate type
即:无法将lambda表达式转换为"System.Delegate",因为它不是delegate类型
即使把Lambda表达式改成匿名方法的写法也不行:
public void TestMethod(){ this.Dispatcher.BeginInvoke(delegate() { this.textBlock1.Text = DateTime.Now.ToString("HH:mm:ss fff"); });}
仍然会报错:
Cannot convert anonymous method to type 'System.Delegate'because it is not a delegate type
即:无法将匿名方法转换为"System.Delegate",因为它不是delegate类型
当然也可以自己定义一个Delegate类型用最传统的方法来写:
delegate void MyDelegate();delegate void MyDelegate2(object s); public void TestMethod(){ MyDelegate d = new MyDelegate(UpdateText); this.Dispatcher.BeginInvoke(d);} void UpdateText(){ this.textBlock1.Text = DateTime.Now.ToString("HH:mm:ss fff");} void UpdateText2(object s){ this.textBlock1.Text = s.ToString();} public void TestMethod2(object s){ MyDelegate2 d = new MyDelegate2(UpdateText2); this.Dispatcher.BeginInvoke(d, "Hello World");}
但是这种写法太繁琐了,还得单独把方法的定义提取出来,同时还要定义相应的委托类型,难道不能象Silverlght中那样清爽一点么?
既然出错的原因就是编译器不自动做类型转换,那我们就来强制转换吧
public void TestMethod(){ this.Dispatcher.BeginInvoke((Action)delegate() { this.textBlock1.Text = DateTime.Now.ToString("HH:mm:ss fff"); });} public void TestMethod2(object s){ this.Dispatcher.BeginInvoke((Action)(() => { this.textBlock1.Text = s.ToString(); }));}
这样就可以了,把匿名方法/Lambda表达式强制转换为Action,而Action实质就是委托类型,so,问题解决了!
不过仍然有点疑问:为啥编译器能自动认别Silverlight,却不认WPF呢?这算不算是编译器的BUG(或是需要改进的地方)
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
- Silverlight与WPF中BeginInvoke的差异
- Silverlight与WPF中BeginInvoke的差异
- Silverlight与WPF中BeginInvoke的差异
- 【转】Silverlight与WPF中BeginInvoke的差异
- WPF与SilverLight共性和差异
- WPF与silverlight的关系
- WPF的Invoke()和BeginInvoke()
- WPF与winform与silverlight的区别
- Silverlight与WPF入门与[转]
- SilverLight与WPF的Loaded事件触发
- wpf与Silverlight的关键区别
- WPF与Silverlight的命名模板控件
- 浅析WPF与Silverlight的关键区别
- 浅析WPF与Silverlight的关键区别
- WPF,SilverLight中直线的样式示例
- Silverlight/WPF中 动态Style 的问题
- WPF 与winform获取鼠标坐标的差异
- C#中begininvoke与invoke
- LINUX笔记:VI 、VIM的使用
- 网站推广需要注意的十点
- Android漫游记(3)---重定位之GOT & PLT & R_ARM_JUMP_SLOT
- Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)!
- log4j配置文件详解
- 【转】Silverlight与WPF中BeginInvoke的差异
- JAXB转变对象到xml
- 贪心算法之活动安排问题
- error LNK2001: unresolved external symbol _WinMain@16的解决方法
- 复习linux下几种查找命令
- 找最大独立集问题-Finding a Maximal Independent Set
- object-c connection with java socket
- oracle cluster 物理配置要求及限制
- SQL Server 存储过程--传递数组、使用循环