看到別人寫的代碼中,private async void Button_Click(object sender, RoutedEventArgs e){if (rssURL.Text != ""){RssService.GetRssItems(rssURL.Text,async (items) => { await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() =>{listbox.ItemsSource = items; });},async (exception) =>{await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>{await new MessageDialog(exception).ShowAsync();});},null);}=======================分割線這其中async (items) => { },這一段到底是什么用法。我知道Lambda表達式是委托,匿名函數的簡寫方式。但是這篇代碼中從上到尾都沒有Delegate定義。
2 回答

慕森卡
TA貢獻1806條經驗 獲得超8個贊
async 關鍵字表示將被修飾的方法、Lambda 表達式或匿名方法指定為異步。但并不是說被修飾的部分被強制轉為異步了,而是使方法可被分割成多個片段,被修飾的方法依然是同步運行,直至到達其第一個 await 表達式,此時會將方法掛起,直到等待的任務完成。
而 await 是一個運算符,應用于一個異步方法的任務掛起方法的執行,直到等待任務完成。與 async 配合使用。
=> 確實是 Lambda 表達式。
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { listbox.ItemsSource = items; }); |
等效于:
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, delegate { listbox.ItemsSource = items; }); |
以上的代碼如果用同步的話就是:
RssService.GetRssItems( rssURL.Text, (items) => { listbox.ItemsSource = items; }, (exception) => { new MessageDialog(exception).ShowAsync(); }, null ); |
這樣是不是好理解一些?

侃侃無極
TA貢獻2051條經驗 獲得超10個贊
C# 4.5中引入了async 和 await。這兩個關鍵字可以讓你更方便的寫出異步代碼。
async (items) => { },這應該是匿名方法,我寫了個類似的代碼,可以參考一下,提供些思路:
class Program { static void Main( string [] args) { MyClass myClass= new MyClass(); Console.ReadLine(); } } public class MyClass { public MyClass() { //這里不會阻塞 ForEach(async () => { double result = await GetValueAsync(1234.5, 1.01); //此處會開新線程處理GetValueAsync任務,然后方法馬上返回 //這之后的所有代碼都會被封裝成委托,在GetValueAsync任務完成時調用 Console.WriteLine( "Value is : " + result); }); Console.WriteLine( "MyClass() End." ); } public Task< double > GetValueAsync( double num1, double num2) { return Task.Run(() => { for ( int i = 0; i < 100000; i++) { num1 = num1 / num2; } return num1; }); } public void ForEach(Action action) { action(); } } |
- 2 回答
- 0 關注
- 94 瀏覽
添加回答
舉報
0/150
提交
取消