2010-01-28 15 views
7

sto facendo un Drag Drop per applicazione esterna in questo modo:DoDragDrop congela WinForms app volte

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

// get files 

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

e alcune applicazioni prenderanno i file e andare avanti per la loro elaborazione e la mia app è libero di fare è roba , ma alcune app renderanno la mia app bloccata finché non processerà tutti i file ... c'è un modo per aggirare questo? Ho provato a farlo in una discussione ma non ha funzionato così bene - non ha funzionato affatto ... quindi, qualche suggerimento su come fare questo codice non appende la mia app?

risposta

3

.NET Control.DoDragDrop è solo un Wapper intorno API Win32 chiamato .. (attendere che) .. DoDragDrop

quindi ha le stesse limitazioni. DoDragDrop può essere chiamato solo da un thread che ha chiamato OleInitialize, che rende il thread un thread di tipo STA (Single Threaded Apartment).

Poiché può essere utilizzato solo da un thread STA e la progettazione dell'API è sincrona, si è in balia della gestione delle notifiche di destinazione delle applicazioni di destinazione. Questo è solo parte del design di OLE Drag and Drop e non può essere modificato. (OLE Il drag and drop era in realtà progettato nei giorni di Windows 3x, prima che i thread esistessero anche nelle applicazioni Windows).

Quindi, è possibile forse rendere questo lavoro su un altro thread IFF che thread è un thread STA. Probabilmente dovresti usare anche interop per chiamare la funzione DoDragDrop non gestita.

+0

Hmm, è interessante e scommetto che hai ragione, ma questo non risolve il problema;) Voglio dire ... Non ho bisogno di eseguire DoDragDrop async ... tutto quello che devo fare è avere la parte di scambio dei dati per essere asincrona ... Ho letto da qualche parte che il DataObject dovrebbe implementare qualche interfaccia asincrona ma non riesco a trovarlo ora ... Sai forse dove posso trovare il 'posto' dove il mio l'app scambia i dati con l'altra app? (utilizzando DoDragDrop ofc) – argh

+0

La parte di scambio dati si trova all'interno di DoDragDrop, quindi se si desidera che l'interscambio di dati sia asincrono, è necessario inserire DoDragDrop su un altro thread. e deve essere un thread STA. Sai come forzare un thread per essere STA in .NET? –

+0

Beh ... correggetemi se sbaglio, ma se ho capito: [STAThread] void Main (string [] parametri statici) allora è eseguito in STA Filo, giusto? – argh

0

Si blocca sempre, ma il ritardo non si nota con file di piccole dimensioni. Controlla this answer.