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>();
}
() => { /* ... */ }
是一个没有输入参数的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
修饰符才能运行。