亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

難道是僅僅代表參數items,然后執行{}中內容?

難道是僅僅代表參數items,然后執行{}中內容?

C#
撒科打諢 2023-03-17 17:13:05
看到別人寫的代碼中,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);

這樣是不是好理解一些?


查看完整回答
反對 回復 2023-03-20
?
侃侃無極

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


查看完整回答
反對 回復 2023-03-20
  • 2 回答
  • 0 關注
  • 94 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號