2013-05-07 57 views
1

我選擇一些圖像,並將它們加載到BitmapImage的主線程,現在我想將它們保存到SQLSERVER數據庫在另一個線程(BackgroundWorker的),但出現以下錯誤:轉換的BitmapSource以字節數組在另一個線程

調用線程不能訪問此對象,因爲不同的線程擁有它。

注意:目標字段的數據類型是varbinary(最大值)

示例代碼:

class Class1 
    { 
     private List<BitmapSource> Items; 
     public Class1() 
     { 
      this.Items = new List<BitmapSource>(); 
     } 
     public void AddItem(BitmapSource bs) 
     { 
      this.Items.Add(bs); 
     } 
     public void Save() 
     { 
      BackgroundWorker bw = new BackgroundWorker(); 
      bw.DoWork += bw_DoWork; 
      bw.RunWorkerCompleted += bw_RunWorkerCompleted; 
      bw.RunWorkerAsync(this.Items); 
     } 

     void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      throw new NotImplementedException(); 
     } 

     void bw_DoWork(object sender, DoWorkEventArgs e) 
     { 
      MyBLL bl = new MyBLL(); 
      bl.Save(e.Argument as List<BitmapSource>); 
     } 

    } 

public class MyBLL 
    { 

     public byte[] ConvertBitmapSourceToByteArray(BitmapSource BS) 
     { 
      if (BS == null) 
      { 
       return new byte[] { }; 
      } 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       JpegBitmapEncoder jbe = new JpegBitmapEncoder(); 

       jbe.Frames.Add(BitmapFrame.Create(BS.Clone())); 
       jbe.Save(ms); 
       return ms.GetBuffer(); 
      } 
     } 

     public void Save(List<BitmapSource> _items) 
     { 
      foreach (BitmapSource item in _items) 
      { 
       --- insert ConvertBitmapSourceToByteArray(item) to DataBase --- 
      } 
     } 

    } 
+0

你能提供代碼嗎? – 2013-05-07 04:37:08

+0

謝謝。我添加了一個示例代碼到我的問題 – 2013-05-07 06:00:41

回答

0

你所得到的錯誤,因爲在UI線程創建了BitmapSource和你想通過另一個線程訪問它。爲了避免這種情況,您需要更改將BitmapSource轉換爲另一個不依賴於BitmapSource或轉換爲UI線程中的字節的方法。

+0

好吧,但我怎麼能將BitmapSource轉換爲不依賴於BitmapSource的字節?我不想在UI線程中將bitmapsource轉換爲字節 – 2013-05-07 06:05:30

+0

您在哪裏獲得'BitmapSource's? – 2013-05-07 06:27:31

+0

我從一個自定義類中獲取一個類型爲BitmapSource的圖像文件,並將其綁定到UI,然後將其傳遞給Class1的AddItem方法。 – 2013-05-07 06:43:50

0
 BackgroundWorker worker = new BackgroundWorker(); 
     Image yourImg = new Bitmap(1,1); 
     worker.DoWork += new DoWorkEventHandler((o,arg)=>{ 
      Image img = arg.Argument as Image; 
      //Do whatever you want with your image 
     });    
     worker.RunWorkerAsync(yourImg);//pass your image as a parameter to your sub-thread 
+0

謝謝,但我想傳遞一個綁定到UI的BitmapSource的集合。 – 2013-05-07 06:00:10

2

你將不得不Freeze了的BitmapSource,使其從其他線程訪問,也許在的AddItem:

public void AddItem(BitmapSource bs) 
{ 
    bs.Freeze(); 
    this.Items.Add(bs); 
} 

還請注意,這是沒有必要的調用BitmapFrame.Create之前,克隆的BitmapSource:

jbe.Frames.Add(BitmapFrame.Create(BS));