Silverlight与WPF中BeginInvoke的差异
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中如果這樣用,會報如下錯誤:?
Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
即:無法將lambda表達式轉換為"System.Delegate",因為它不是delegate 類型
即使把Lambda表達式改成匿名方法的寫法也不行:
仍然會報錯:
Cannot convert anonymous method to type 'System.Delegate' because it is not a delegate type
即:無法將匿名方法轉換為"System.Delegate",因為它不是delegate 類型
當然也可以自己定義一個Delegate類型用最傳統的方法來寫:
但是這種寫法太繁瑣了,還得單獨把方法的定義提取出來,同時還要定義相應的委托類型,難道不能象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(或是需要改進的地方)
轉載于:https://www.cnblogs.com/yjmyzz/archive/2010/03/18/1689256.html
總結
以上是生活随笔為你收集整理的Silverlight与WPF中BeginInvoke的差异的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#与WMI使用技巧集
- 下一篇: 过程