看到别人写的代码中,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 关注
- 68 浏览
添加回答
举报
0/150
提交
取消