DoDragDrop иногда останавливает приложение WinForms - PullRequest
7 голосов
/ 28 января 2010

Я делаю Drag Drop для внешнего приложения, как это:

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

// get files

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

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

Ответы [ 2 ]

3 голосов
/ 29 января 2010

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

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

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

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

0 голосов
/ 16 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...