2010-03-24 137 views
0

我的代碼有問題,我無法修復它。WPF調度程序/線程問題

private static void SetupImages(object o) 
    { 
     int i = (int)o; 
     BitmapImage bi = GetBitmapObject(i); 
     img = new System.Windows.Controls.Image();//declared as static outside 

     img.Source = bi;//crash here 
     img.Stretch = Stretch.Uniform; 
     img.Margin = new Thickness(5, 5, 5, 5); 
    } 

這被稱爲是這樣的:

for (int i = 0; i < parameters.ListBitmaps.Count; i++) 
     { 
      ParameterizedThreadStart ts = new ParameterizedThreadStart(SetupImages); 
      Thread t = new Thread(ts); 
      t.SetApartmentState(ApartmentState.STA); 
      t.Start(i); 
      t.Join(); 
      //SetupImages(i); 
      parameters.ListImageControls.Add(img); 
     } 

它總是崩潰在這條線:img.Source =雙向; 錯誤是: 「‘System.InvalidOperationException’類型的未處理的異常出現在WindowsBase.dll

其他信息:因爲不同的線程擁有它調用線程不能訪問此對象」

由於

回答

2

如前所述,BitmapImage只能用於創建它的線程中。

如果您加載許多小尺寸的圖像,則可以在後臺線程中將圖像加載到MemoryStream。一旦你有內存中的數據,切換到UI線程和設置StreamSource:

image.StreamSource = new MemoryStream(data);

1

對象從DispatcherObject降序具有線程的親和性。這意味着其大部分屬性和方法不能從除創建對象的線程之外的任何線程訪問。

BitmapImage從何而來?誰創建它並在哪個線程上?

我認爲如果你解釋你試圖達到的目標,你想要做的事可能會做得更簡單。

+0

感謝您的回答。 BitmapImage來自這裏: private static BitmapImage GetBitmapObject(int nPos) { return parameters.ListBitmaps [nPos]; } 我想從磁盤加載一些位圖文件並將它們添加到網格。我需要在一個線程中執行此操作,以便在加載圖像時更新狀態窗口。 – phm 2010-03-24 09:22:22