2014-10-07 80 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修改運行。