2013-05-15 41 views
0

我正在使用async/await等移動一些長時間運行的代碼到背景,但碰到主題行錯誤。我很清楚,我無法從任務更新WPF UI控件(並且我已經適當地添加了調度程序),但是發生此錯誤僅僅是更新我的類中的對象。例如:調用線程不能訪問這個對象,因爲一個不同的線程擁有它(異步/等待/任務)

private WriteableBitmap TempImage; 

public async void StartProcessing() 
{ 
    WriteableBitmap LoadedImage = new WriteableBitmap(await LoadImage(0)); //ERROR HERE 
    LoadedImage.Freeze(); 
    TempImage = LoadedImage; 
    // do more stuff 
} 

private Task<BitmapImage> LoadImage(int imageIndex) 
{ 
    return Task.Run(() => 
     { 
      FileStream fileStream = new FileStream(fileList[0], FileMode.Open, FileAccess.Read); 

      var img = new BitmapImage(); 
      img.BeginInit(); 
      img.StreamSource = fileStream; 
      img.EndInit(); 
      return img; 
     }); 
    } 

「凍結」的東西是我目前的解決它的嘗試,但它仍然當我試圖返回的圖像分配給我的類級變量發生。我假設這是因爲我的UI線程實例化類,因此變量是在UI線程上下文中,但不知道如何解決它?

回答

2

您可能還需要凍結在LoadImage中創建的BitmapImage。此外,您還應該在加載圖像後關閉FileStream。因此您需要設置BitmapCacheOption.OnLoad標誌。

using (var fileStream = new FileStream(fileList[0], FileMode.Open, FileAccess.Read)) 
{ 
    var img = new BitmapImage(); 
    img.BeginInit(); 
    img.CacheOption = BitmapCacheOption.OnLoad; // here 
    img.StreamSource = fileStream; 
    img.EndInit(); 
    img.Freeze(); // and here 
    return img; 
} 
+0

謝謝 - 這似乎有所幫助。現在在別處獲得相同的錯誤,所以我應該能夠應用類似的修復程序。 – James

0

您可以使用Dispatcher將加入WriteableBitmap的呼叫編入到創建它的線程中。

+0

調度員似乎超出了範圍,因爲此時我不在UI類中。雖然我猜可能還有一些方法仍然可以調用它?無論如何,其他建議似乎工作:) – James

相關問題