2012-03-01 5 views
5

Estoy haciendo un trabajo pesado en un backgroundworker, para que no afecte mi subproceso de la interfaz de usuario de Silverlight. Sin embargo, en la función DoWork obtengo esta excepción:Obteniendo "Access Access no autorizada" en un BackgroundWorker sin acceder al hilo de la interfaz de usuario

UnauthorizedAccessException "Acceso a hilos cruzados no válido".

Yo sé que no puedo acceder al hilo de interfaz de usuario de la BackgroundWorker, Sin embargo, esta excepción se produce en esta línea:

ListBoxItem insert = new ListBoxItem(); 

¿Cómo es que al acceder a mi hilo de interfaz de usuario ??

Aquí está la pieza real de código que he reducido a. Básicamente estoy haciendo trabajo creando listboxitems la que me gustaría insertar al cuadro de lista sourceList:

void FillSourceList() 
{ 
    busyIndicator.IsBusy = true; 
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += (sender, args) => 
     { 
      List<ListBoxItem> x = new List<ListBoxItem>(); 
      for (int i = 0; i < 25; i++) 
      { 
       ListBoxItem insert = new ListBoxItem(); //<---Getting exception here 
       insert.Content = "whatever"; 
       x.Add(insert); 
      } 
      args.Result = x; 
     }; 
    bw.RunWorkerCompleted += (sender, args) => 
     { 
      foreach (ListBoxItem insert in (List<ListBoxItem>)(args.Result)) 
       sourceList.Items.Add(insert); 
      busyIndicator.IsBusy = false; 
     }; 

    bw.RunWorkerAsync(); 
} 

Respuesta

4

Un ListBoxitem deriva de control por lo que se considera parte de la interfaz gráfica de usuario. Hubiera esperado que un elemento "separado" estuviera bien en un hilo también, pero aparentemente no lo es.

La solución obvia: crear una lista x de contenido (cadenas) y retrasar la creación de los elementos para el evento completado.

+0

Gracias. Sí, parece un poco innecesario para que no esté bien, pero interesante de todos modos. Hago otro procesamiento en 'ListBoxItem's basado en el contenido, como colorear, por lo que no puedo simplemente crear cadenas ... sin embargo, supongo que administraré la información que necesito en un KeyValuePair o algo así hasta que su creación. –

+0

Podría considerar un mini ViewModel para los artículos. Solo une una lista al ItemsSource y estás listo, incluido el hilo de seguridad. –

+0

¡Buena idea! Probablemente lo haga, no debería requerir demasiados cambios para el resto del proyecto (espero;). –