2010-01-28 16 views
7

que estoy haciendo una gota Arrastre para aplicación externa de esta manera:DoDragDrop congela aplicación WinForms veces

string[] files = new string[/* */]; 

// get files 

DataObject o = new DataObject(DataFormats.FileDrop, files); 
DoDragDrop(o, DragDropEffects.Copy | DragDropEffects.Move); 

y algunas aplicaciones tendrán los archivos y pasar a procesarlos y mi aplicación es libre de hacer son cosas , pero algunas aplicaciones harán que MI aplicación se congele hasta que procesen todos los archivos ... ¿hay alguna forma de evitarlo? Intenté hacerlo en un subproceso pero eso no funcionó tan bien; no funcionó en absoluto ... ¿así que, cualquier sugerencia de cómo hacer este código no cuelga mi aplicación?

Respuesta

3

.NET Control.DoDragDrop es sólo un Wapper alrededor de la API de Win32 llamada .. (esperar a que) .. DoDragDrop

lo que tiene las mismas limitaciones. DoDragDrop solo se puede invocar desde un hilo que ha llamado al OleInitialize, lo que hace que el hilo sea un hilo de tipo STA (Single Threaded Apartment).

Debido a que solo puede ser utilizado por un hilo STA, y el diseño de la API es síncrono, usted está a merced del manejo de las notificaciones de destino de las aplicaciones de destino. Esto es solo parte del diseño de OLE Drag and Drop y no se puede cambiar. (OLE Arrastrar y soltar en realidad fue diseñado en Windows 3x días, incluso antes de que los hilos existieran en las aplicaciones de Windows).

Por lo tanto, podría tal vez hacer que este trabajo en otro hilo IFF ese hilo es un hilo STA. Probablemente también deba usar la interoperabilidad para llamar a la función no administrada DoDragDrop.

+0

Hmm, eso es interesante y apuesto a que tienes razón, pero eso no resuelve el problema;) Quiero decir ... No necesito ejecutar DoDragDrop asincrónico ... todo lo que tengo que hacer es tener la parte de intercambiar los datos para ser asíncrono ... Leí en alguna parte que el DataObject tendría que implementar alguna interfaz asíncrona pero no puedo encontrarla ahora ... ¿Sabes dónde podría encontrar el "lugar" donde mi la aplicación intercambia los datos con la otra aplicación? (usando DoDragDrop ofc) – argh

+0

La parte de intercambio de datos está dentro de DoDragDrop, por lo que si desea que el análisis de datos sea asíncrono, entonces debe colocar DoDragDrop en otro hilo. y debe ser un hilo STA. ¿Sabes cómo forzar un hilo para que sea STA en .NET? –

+0

Bueno ... me corrija si estoy equivocado, pero si lo he entendido: [STAThread] void Main (string [] parámetros estáticos) entonces está siendo ejecutado en STA hilo, ¿verdad? – argh

0

Siempre se congelará, pero la demora no se nota con archivos pequeños. Consulte this answer.

Cuestiones relacionadas