2015-08-22 25 views
0

我的程序中有兩個圖像,我有一個函數來比較兩個BitmapSources,問題是我將一個ImageSource轉換爲BitmapSource並將其分配給一個變量,並將其發送給任務內部的函數(因爲函數相當慢,我更喜歡使用任務,然後在完成時更新用戶),它給我一個錯誤,即任務不能使用此變量,因爲另一個線程擁有它...請幫助我解決它。從DispatcherObject衍生發送BitmapSource任務計算-wpf c#

private async void btnAnalyze_Click(object sender, RoutedEventArgs e) 
    { 
     if (AnalyzeImage?.Status == TaskStatus.Running) await AnalyzeImage; 
     var baseSource = (BitmapSource)imgBase.Source; 
     var newSource = (BitmapSource)imgNew.Source; 
     if (baseSource?.CompareSizeTo(newSource) == false) 
     { 
      ShowStatus("Images are different in size or at least one of them is null"); 
      return; 
     } 
     btnAnalyze.IsEnabled = false; 
     ShowStatus(); 
     try 
     { 
      AnalyzeImage = Task<BitmapSource>.Factory.StartNew(() => baseSource?.ConvertToBitmap().CompareTo(newSource?.ConvertToBitmap()).BitmapToImageSource()); 
      InvokeA(() => waitingPanel.Visibility = Visibility.Visible); 
      await AnalyzeImage; 
      imgNew.Source = AnalyzeImage.Result; 
     } 
     catch (Exception ex) { Notify("Error in btnAnalyzeClick", ex, true); } 
     finally { InvokeA(() => waitingPanel.Visibility = Visibility.Hidden); } 
    } 
+0

表現出一定的代碼好嗎? – Slashy

+0

我更新了,如果你想要別的東西,具體說什麼...... @Slashy – David47

+0

ConvertToBitmap(),BitmapToImageSource() - 是那些擴展方法? – alexm

回答

1

對象具有由調用線程線程關聯,即一旦被創建他們是「擁有」。在WPF應用程序中,它通常是UI線程。

如果BimtapSource實例化被放置await後它將使用當前的上下文(UI在這種情況下),使該對象的消費由UI組件:

private async void btnAnalyze_Click(object sender, RoutedEventArgs e) 
{ 
    if (AnalyzeImage?.Status == TaskStatus.Running) await AnalyzeImage; 
    var baseSource = (BitmapSource)imgBase.Source; 
    var newSource = (BitmapSource)imgNew.Source; 
    if (baseSource?.CompareSizeTo(newSource) == false) 
    { 
     ShowStatus("Images are different in size or at least one of them is null"); 
     return; 
    } 
    btnAnalyze.IsEnabled = false; 
    ShowStatus(); 
    try 
    { 
     waitingPanel.Visibility = Visibility.Visible; 
     var worker = Task<Bitmap>.Factory.StartNew(() =>   
         baseSource?.ConvertToBitmap() 
        .CompareTo(newSource?.ConvertToBitmap())); 

     var bmp = await worker; 

     // The next statement is executed in UI synchronization context 
     imageNew.Source = bmp.BitmapToImageSource(); 

    } 
    catch (Exception ex) 
    { 
     Notify("Error in btnAnalyzeClick", ex, true); 
    } 
    finally 
    { 
     waitingPanel.Visibility = Visibility.Hidden; 
    } 
} 
+0

我已經完成了你所說的任務,並且將兩個文件的BitmapSource轉換爲位圖。 – David47