2011-06-13 9 views
5

He intentado utilizar estas recomendaciones: http://msdn.microsoft.com/en-us/library/ms741870.aspx ("Manejo de una operación de bloqueo con un hilo de fondo").Cómo establecer la propiedad Image.Source con Dispatcher?

Este es mi código: "debido al subproceso de la llamada no puede acceder a este objeto porque un subproceso diferente es el dueño"

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      ; 
     } 

     private void Process() 
     { 
      // some code creating BitmapSource thresholdedImage 

      ThreadStart start =() => 
      { 
       Dispatcher.BeginInvoke(
        System.Windows.Threading.DispatcherPriority.Normal, 
        new Action<ImageSource>(Update), 
        thresholdedImage); 
      }; 
      Thread nt = new Thread(start); 
      nt.SetApartmentState(ApartmentState.STA); 
      nt.Start(); 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      button1.IsEnabled = false; 
      button1.Content = "Processing..."; 

      Action action = new Action(Process); 
      action.BeginInvoke(null, null); 
     } 

     private void Update(ImageSource source) 
     { 
      this.image1.Source = source; // ! this line throw exception 

      this.button1.IsEnabled = true; // this line works 
      this.button1.Content = "Process"; // this line works 
     } 
    } 

En línea marcada que arroja InvalidOperationException. Pero la aplicación funciona si elimino esta línea.

XAML: 
<!-- language: xaml --> 
    <Window x:Class="BlackZonesRemover.MainWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:my="clr-namespace:BlackZonesRemover" 
      Title="MainWindow" Height="600" Width="800" Loaded="Window_Loaded"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 
      <Border Background="LightBlue"> 
       <Image Name="image1" Stretch="Uniform" /> 
      </Border> 
      <Button Content="Button" Grid.Row="1" Height="23" Name="button1" Width="75" Margin="10" Click="button1_Click" /> 
     </Grid> 
    </Window> 

Qué diferencia entre la propiedad y las propiedades Image.Source Button.IsEnabled y Button.Content? ¿Que puedo hacer?

Respuesta

10

Consejo específico:thresholdImage se está creando en un hilo de fondo. Puede crearlo en el hilo de la interfaz de usuario o congelarlo una vez que se haya creado.

Indicaciones generales: La diferencia es que ImageSource es un DependencyObject por lo que tiene afinidad hilo. Por lo tanto, debe crear el ImageSource en el mismo subproceso que el Image al que lo está asignando (es decir, el subproceso de la interfaz de usuario), o necesita Freeze() el ImageSource una vez que lo haya creado, permitiendo así que cualquier subproceso tenga acceso eso.

+0

Gracias. Ahora funciona y ahora tengo el punto –

Cuestiones relacionadas