Bezdepbonusu7Программирование: статьи и ответы

Вопрос

DoDragDrop иногда зависает приложение WinForms

Автор вопроса: arghОтветов: 2

Я делаю перетаскивание во внешнее приложение следующим образом:

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

// get files

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

и некоторые приложения возьмут файлы и перейдут к их обработке, и мое приложение может делать это бесплатно, но некоторые приложения заставят мое приложение зависать, пока оно не обработает все файлы ... есть ли способ обойти это? Я пытался сделать это в потоке, но это не сработало - это вообще не сработало ... итак, какие-либо предложения, как сделать так, чтобы этот код не зависал в моем приложении?

freezedrag-and-dropwinforms

Ответы

Ответ 1 · рейтинг 3 · John Knoeller

.NET Control.DoDragDrop - это просто оболочка вокруг Win32 api под названием .. (подождите) .. DoDragDrop

Так что у него те же ограничения. DoDragDrop может быть вызван только из потока, который вызвал OleInitialize, что делает поток потоком типа STA (однопоточная квартира).

Поскольку он может использоваться только потоком STA, а разработка API является синхронной, вы зависите от обработки уведомлений об отбрасывании конечными приложениями. Это всего лишь часть дизайна OLE Drag and Drop, и его нельзя изменить. (OLE Drag and drop был фактически разработан в Windows 3x дней, до того, как потоки даже существовали в приложениях Windows).

Итак, вы могли бы возможно выполнить эту работу в другом потоке IFF, этот поток является потоком STA. Вам также, вероятно, придется использовать взаимодействие для вызова неуправляемой функции DoDragDrop.

Ответ 2 · bohdan_trotsenko

Он всегда будет зависать, но для небольших файлов задержка не заметна. Ознакомьтесь с этим ответом.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы