为了账号安全,请及时绑定邮箱和手机立即绑定

难道是仅仅代表参数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 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信