c中闭包示例中的async关键字

本文关键字:async 关键字 闭包 | 更新日期: 2023-09-27 18:25:43

我正在浏览这个博客,了解如何增加负载。

http://marcominerva.wordpress.com/2013/05/22/implementing-the-isupportincrementalloading-interface-in-a-window-store-app/

我需要帮助理解以下方法:我认为:

()  =>
{
}

意思是没有输入参数的闭包。为什么在()=>之前添加"async"?为什么LoadMoreItemsSync()方法返回IAsyncOperation<>,但它叫"任务.运行"?操作在返回之前运行了吗?

 public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
    {
        var dispatcher = Window.Current.Dispatcher;
        return Task.Run<LoadMoreItemsResult>(
            async () =>   // why aysnc here?
            {
                uint resultCount = 0;
                var result = await source.GetPagedItems(currentPage++, itemsPerPage);
                if (result == null || result.Count() == 0)
                {
                    hasMoreItems = false;
                }
                else
                {
                    resultCount = (uint)result.Count();
                    await dispatcher.RunAsync(
                        CoreDispatcherPriority.Normal,
                        () =>
                        {
                            foreach (I item in result)
                                this.Add(item);
                        });
                }
                return new LoadMoreItemsResult() { Count = resultCount };
            }).AsAsyncOperation<LoadMoreItemsResult>();
    }

c中闭包示例中的async关键字

() => { /* ... */ }是一个没有输入参数的lambda,就委托而言,它将是一个Action

要使用await关键字,该方法必须标记有async。由于lambda函数的主体包含await,因此必须使用异步lambda语法。

LoadMoreItemsAsync方法的目的是几乎立即返回并在后台继续加载项,即相对于调用线程异步。这样做是因为加载可能需要一些时间,并且您不想阻塞UI。

为此,它使用返回Task<LoadMoreItemsResult>Task.Run方法,AsAsyncOperation<LoadMoreItemsResult>()将其转换为实现IAsyncOperation<LoadMoreItemsResult>接口的对象。

运行async代码的Lambda Expression需要标记为async才能在其中使用await关键字。类似于Named Method需要标记自己async的想法。

这向编译器发出信号,表示应该在执行流中生成状态机。

此:

var result = await source.GetPagedItems(currentPage++, itemsPerPage);

这个:

await dispatcher.RunAsync(
           CoreDispatcherPriority.Normal,
           () =>
           {
               foreach (I item in result)
                   this.Add(item);
           });

需要async修饰符才能运行。