Silverlight与WPF中BeginInvoke的差异

简介: 原文http://www.cnblogs.com/yjmyzz/archive/2010/03/18/1689256.html Silverlight/WPF中,如果要在多线程中对界面控件值做修改,用Dispatcher对象的BeginInvoke方法无疑是最方便的办法 ,见:温故而知新:Wi...

原文http://www.cnblogs.com/yjmyzz/archive/2010/03/18/1689256.html

Silverlight/WPF中,如果要在多线程中对界面控件值做修改,用Dispatcher对象的BeginInvoke方法无疑是最方便的办法 ,见:温故而知新:WinForm/Silverlight多线程编程中如何更新UI控件的值

但今天发现WPF中的BeginInvoke却无法自动将匿名方法/Lambda表达式转变成Delegate类型(注:对委托,匿名方法,Lambda感到陌生的朋友先阅读温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件)

silverlight中的代码片段:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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中如果这样用,会报如下错误: 

Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type

即:无法将lambda表达式转换为"System.Delegate",因为它不是delegate 类型


即使把Lambda表达式改成匿名方法的写法也不行:

?
1
2
3
4
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类型用最传统的方法来写:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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中那样清爽一点么?

既然出错的原因就是编译器不自动做类型转换,那我们就来强制转换吧

?
1
2
3
4
5
6
7
8
9
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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
目录
相关文章
|
C# 前端开发
WPF,SilverLight中直线的样式示例
原文:WPF,SilverLight中直线的样式示例 XAML代码:// LineStyle.xaml                                                           ...
716 0
|
C# 前端开发
silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发) 前面我们画了一只会飞动的小鸟,今天我们在目标是一个会发光的太阳。本章节的动画虽然简单,但是实现的效果可是一点也不打折。
1186 0
|
C#
silverlight,WPF动画终极攻略之会飞的小鸟篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之会飞的小鸟篇(Blend 4开发) 本教程基本涵盖了WPF和silverlight中的各种动画。先上张效果图。 声明下,这个做的不是让大家照搬的,只是让大家熟悉下动画效果,这个成品基本涵盖了sl里面所有的动画效果。
1399 0
|
C#
silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发) 有个问题想请教下大家,我仿了腾讯的SL版QQ,相似度95%以上。我想写成教程教大家怎么开发出来,会不会有版权什么问题的。
1149 0
|
前端开发 C#
silverlight,WPF动画终极攻略之白云飘,坐车去旅游篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之白云飘,坐车去旅游篇(Blend 4开发) 这章有点长,所以我分成了两章。这一章主要是准备工作,差不多算美工篇吧,这章基本不会介绍多少动画效果,主要讲的是blend中工具的使用,利用哪些工具做出哪些效果。
1254 0
|
前端开发 C#
silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发) 这篇介绍的是3D导航,点击图标,页面360°翻转的效果!有什么不足的欢迎大家指出来。 1.新建一个usercontrol,命名为menu. 2.按照下图设置一下属性。
1246 0
|
C# Windows
为WPF和Silverlight的Grid添加边框线(zz)
原文:为WPF和Silverlight的Grid添加边框线(zz)   Grid是WPF和Silverlight中的一个重要的布局元素,其他的布局元素还有StackPanel, Canvas, Border等等。
1334 0
|
7月前
|
C# 开发者 Windows
基于Material Design风格开源、易用、强大的WPF UI控件库
基于Material Design风格开源、易用、强大的WPF UI控件库
398 0
|
7月前
|
C#
浅谈WPF之装饰器实现控件锚点
使用过visio的都知道,在绘制流程图时,当选择或鼠标移动到控件时,都会在控件的四周出现锚点,以便于修改大小,移动位置,或连接线等,那此功能是如何实现的呢?在WPF开发中,想要在控件四周实现锚点,可以通过装饰器来实现,今天通过一个简单的小例子,简述如何在WPF开发中,应用装饰器,仅供学习分享使用,如有不足之处,还请指正。
151 1
|
4月前
|
开发框架 缓存 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件