2015-05-29 65 views
0

我已經通過從MSDN下面的示例中的WinRT的應用程序加載增量列表視圖中的縮略圖項目:增量加載在ListView

https://code.msdn.microsoft.com/windowsapps/Data-Binding-7b1d67b5

我想刪除「等待Task.Delay (10)「一行。 當我這樣做時,我得到一個警告,說明該方法缺少等待操作符。

protected async override Task<IList<object>> LoadMoreItemsOverrideAsync(System.Threading.CancellationToken c, uint count) 
     { 
      uint toGenerate = System.Math.Min(count, _maxCount - _count); 

      // Wait for work 
      await Task.Delay(10); 

      // This code simply generates 
      var values = from j in Enumerable.Range((int)_count, (int)toGenerate) 
         select (object)_generator(j); 
      _count += toGenerate; 

      return values.ToArray(); 
     } 

我試圖重寫方法和包裝的整個方法在任務asfollows:

protected async override Task<IList<object>> LoadMoreItemsOverrideAsync(System.Threading.CancellationToken c, uint count) 
      { 
    return await Task.Run(() => { 
       uint toGenerate = System.Math.Min(count, _maxCount - _count); 

       // This code simply generates 
       var values = from j in Enumerable.Range((int)_count, (int)toGenerate) 
          select (object)_generator(j); 
       _count += toGenerate; 

       return values.ToList<object>(); 
      }); 
} 

但是,我得到線程例外:

例外:應用程序調用,這是一個接口編組爲另一個線程。 (異常來自HRESULT:0x8001010E(RPC_E_WRONG_THREAD))

這似乎是我需要在UI線程上運行此?但我無法訪問調度程序。

尋找一些建議

+0

控件上沒有* Invoke(delegate)*方法嗎? –

回答

0

我認爲你看錯了地方。誠然,我在黑暗中採取了一些刺探,但由於其他方法看起來無害,因此很可能需要在UI線程上運行_generator(int)方法。 (也許它不是UI線程本身,但是需要在同一個線程上運行某些東西。由於您提到了縮略圖,最可能的原因是您在一個線程中創建了GDI + Graphics對象,並且正在嘗試在另一個操作它。)

我的建議是仔細檢查您的_generator(int)方法,並製作一個async版本,它會負責確保代碼在正確的線程上運行。這樣封裝得以維持,您的LoadMoreItemsOverrideAsync回調不需要了解關於_generator內部工作的任何信息。


作爲一個方面說明,增加了10ms的延遲幾乎是決然正確的動作,除非你正在積極設法避免一些競爭狀態。 (評論中的「等待工作」是什麼意思?如果你確實在等待工作,你是不是應該等待另一個任務完成,而不是任意的10ms?)

你最可能得到的警告是試圖告訴你:「你已經用async關鍵字標記了這種方法,但沒有任何關於它的異步方法,你忘了await的地方了嗎?」

如果作爲最後的選擇,您別無選擇,只能同步運行代碼,那就做那個。在那裏發表評論,並通過禁用該方法的特定警告來確認情況。