日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

Silverlight与WPF中BeginInvoke的差异

發(fā)布時(shí)間:2025/7/14 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Silverlight与WPF中BeginInvoke的差异 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Silverlight/WPF中,如果要在多線程中對(duì)界面控件值做修改,用Dispatcher對(duì)象的BeginInvoke方法無(wú)疑是最方便的辦法 ,見(jiàn):溫故而知新:WinForm/Silverlight多線程編程中如何更新UI控件的值

但今天發(fā)現(xiàn)WPF中的BeginInvoke卻無(wú)法自動(dòng)將匿名方法/Lambda表達(dá)式轉(zhuǎn)變成Delegate類(lèi)型(注:對(duì)委托,匿名方法,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中如果這樣用,會(huì)報(bào)如下錯(cuò)誤:?

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

即:無(wú)法將lambda表達(dá)式轉(zhuǎn)換為"System.Delegate",因?yàn)樗皇莇elegate 類(lèi)型


即使把Lambda表達(dá)式改成匿名方法的寫(xiě)法也不行:

public void TestMethod() {this.Dispatcher.BeginInvoke(delegate() { this.textBlock1.Text = DateTime.Now.ToString("HH:mm:ss fff"); }); }

仍然會(huì)報(bào)錯(cuò):
Cannot convert anonymous method to type 'System.Delegate' because it is not a delegate type

即:無(wú)法將匿名方法轉(zhuǎn)換為"System.Delegate",因?yàn)樗皇莇elegate 類(lèi)型


當(dāng)然也可以自己定義一個(gè)Delegate類(lèi)型用最傳統(tǒng)的方法來(lái)寫(xiě):

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");}

但是這種寫(xiě)法太繁瑣了,還得單獨(dú)把方法的定義提取出來(lái),同時(shí)還要定義相應(yīng)的委托類(lèi)型,難道不能象Silverlght中那樣清爽一點(diǎn)么?

既然出錯(cuò)的原因就是編譯器不自動(dòng)做類(lèi)型轉(zhuǎn)換,那我們就來(lái)強(qiáng)制轉(zhuǎn)換吧

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表達(dá)式強(qiáng)制轉(zhuǎn)換為Action,而Action實(shí)質(zhì)就是委托類(lèi)型,so,問(wèn)題解決了!


不過(guò)仍然有點(diǎn)疑問(wèn):為啥編譯器能自動(dòng)認(rèn)別Silverlight,卻不認(rèn)WPF呢?這算不算是編譯器的BUG(或是需要改進(jìn)的地方)

轉(zhuǎn)載于:https://www.cnblogs.com/yjmyzz/archive/2010/03/18/1689256.html

總結(jié)

以上是生活随笔為你收集整理的Silverlight与WPF中BeginInvoke的差异的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。