2008-09-25 12 views
13

System.InvalidOperationException: el registro de DragDrop no se completó . ---> System.Threading.ThreadStateException:El registro de DragDrop no tuvo éxito

¿Qué significa esta excepción? Lo consigo en esta línea se trata de añadir un panel a un panel en tiempo de ejecución ...

splitReport.Panel1.Controls.Add(ChartPanel); 

Trabajando en VS2008 C#

Respuesta

33

Esta excepción significa que el subproceso que posee el Grupo (que se añade el Panel) se ha inicializado utilizando el modelo de enhebrado MTA. El sistema de arrastrar/soltar requiere que la cadena de llamada utilice el modelo de cadena STA (en particular, requiere que COM se inicialice a través de OleInitialize). Los modelos de subprocesamiento son un vestigio desafortunado de COM, un predecesor de la plataforma .NET.

Si tiene el atributo [STAThread] en su función Principal, entonces el hilo del programa principal ya debería ser STA. La explicación más probable, entonces, es que esta excepción está sucediendo en un hilo diferente. Observe la ventana de subprocesos en Visual Studio (Debug | Windows | Threads) cuando se produce la excepción y vea si está en un hilo que no sea el hilo principal. Si es así, la solución es probablemente tan simple como establecer el modelo de rosca para que el nuevo hilo, que se puede hacer de la siguiente manera (añadir este código al hilo donde se está creando el control):

Thread.CurrentThread.SetApartmentState(ApartmentState.STA)

(Thread y ApartmentState son miembros de System.Threading)

Ese código tendrá que suceder antes de que realmente inicie el nuevo hilo. Como señaló @Tomer, también puede especificar esto declarativamente utilizando el atributo [STAThread].

Si encuentra que la excepción se está produciendo en el hilo principal, publique de nuevo y avísenos, y tal vez podamos ayudarlo más. Una traza de pila en el momento de la excepción puede ayudar a rastrear el problema.

+2

Si usted no quiere que quejarse con ajuste de forma manual, puede también ponga el atributo [STAThread] en el método de la secuencia. –

2

No estoy seguro de si ha resuelto este problema o no. Acabo de encontrarme con este problema y lo solucioné al deleting my bin directory.

+0

Al eliminar el directorio bin se descubrieron errores de compilación del proyecto –

2

Sí, me doy cuenta de que esta pregunta fue hecha hace 2 años y medio. Llegué a esta excepción e hice algunas lecturas al respecto. Lo corregí, pero no vi mi solución en ningún lado, así que pensé en publicarla en otro lugar que alguien más podría leer.

Una posibilidad de que esto ocurra con [STAThread] marcado en el Main() es si está ejecutando esto en un hilo que no sea el que comenzó.

Acabo de encontrarme con esta excepción cuando intento crear y mostrar un nuevo formulario en un método BackgroundWorker.DoWork. Para solucionarlo, envolví la creación y la presentación de mi nuevo formulario en un método, y luego llamé al Invoke en ese método para que se activara en el subproceso de la interfaz de usuario. Esto funcionó porque el subproceso de la interfaz de usuario comenzó desde el método Main() con [STAThread] marcado, como se explican otras respuestas aquí.

4
function abc 
{ 
      Thread t = new Thread(new ThreadStart(xyz)); 
      t.SetApartmentState(ApartmentState.STA); 
      t.Start();  
} 
function xyz 
{ 
the code of Windows form..or whatever which is causing the error 
} 
+0

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/269b8950-2ef9-483f-8124-e2725ffd5d83/ –

0

he encontrado esta situación recientemente, [STAThreadAttribute] es en mi caso, y he resuelto este problema mediante el uso de invocación método, que podría ser útil para ustedes, así que compartir con un pequeño fragmento de código:

this.Invoke(new InvokeHandler(delegate() 
{ 
//Your method here! 
})); 

Y InvokeHandler es un delegado de esta manera:

private delegate void InvokeHandler(); 
1

Con mucho, la forma más fácil es:

private void DoSomethingOnGui() 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      Safe_DoSomethingOnGui(); 
     }); 
    } 
    else 
    { 
     Safe_DoSomethingOnGui(); 
    } 
} 
private void Safe_DoSomethingOnGui() 
{ 
    // Do whatever you want with the GUI 
} 

Puede incluso pasar cosas a lo largo de ningún problema:

private void DoSomethingOnGui(object o) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      Safe_DoSomethingOnGui(o); 
     }); 
    } 
    else 
    { 
     Safe_DoSomethingOnGui(o); 
    } 
} 
private void Safe_DoSomethingOnGui(object o) 
{ 
    // Do whatever you want with the GUI and o 
} 
0

me encontré con este error, y veo que el que por lo que es muestra es cuando se usa otro hilo llamando MessageBox.Show(this, ...), cuando esto no sea hecho inicializado

Tenemos que eliminar al propietario del cuadro de mensaje para eliminar el error.

0

Resolví este error usando el código siguiente ... Estaba usando Background Worker y tratando de acceder a la IU mientras trabajaba en segundo plano ... es por eso que obtuve un error - El registro de DragDrop no tuvo éxito. No podemos acceder a la IU desde el código que se ejecuta en el trabajador de segundo plano o en el hilo.

BeginInvoke((MethodInvoker)delegate 
{ 
//write your code here... 

}); 

Gracias codificación feliz ...:

2

Añadir el atributo STAThreadAttribute en el método principal. Este atributo es obligatorio si su programa tiene acceso a funciones relacionadas con OLE, como la clase Portapapeles.

[STAThread]

static void main (String [] args)

{

}

Cuestiones relacionadas