2014-10-07 25 views
0

我正在通过此博客了解如何增加负载。c关闭示例中的async关键字#

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

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

() => 
{ 

} 

意味着没有输入参数的闭包。为什么它在()=>之前添加“异步”? 为什么LoadMoreItemsAsync()方法返回IAsyncOperation> <>,但它调用'Task.Run'?它在返回之前运行了吗?

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

回答

1

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

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

LoadMoreItemsAsync方法的目的是几乎立即返回,并继续在后台加载项目,即与调用线程异步。这是完成的,因为大概是加载需要一些时间,你不想阻止用户界面。

为了这样做,它使用了Task.Run方法,它返回一个Task<LoadMoreItemsResult>AsAsyncOperation<LoadMoreItemsResult>()接通到这一点,它实现了IAsyncOperation<LoadMoreItemsResult>接口的对象。

0

运行在运行Lambda Expression需要async码才能使用它里面的await关键字被标记async。类似于Named Method需要标记自己的想法async

这表示编译器应该在执行流程中生成状态机。

此:

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

这:

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

极品async修改运行。