2010-01-28 1 views
7

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

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

// get files 

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

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

ответ

3

в .NET Control.DoDragDrop просто wapper вокруг API Win32 называется .. (вдумайтесь) .. DoDragDrop

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

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

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

+0

Хм, это интересно, и я уверен, что вы правы, но это не решает проблему;) Я имею в виду ... Мне не нужно запускать DoDragDrop async ... все, что мне нужно сделать, это иметь часть обмена данными для async ... Я где-то читал, что DataObject должен будет реализовать некоторый асинхронный интерфейс, но я не могу его найти сейчас ... Возможно, вы знаете, где я могу найти «место», где мои приложение обменивается данными с другим приложением? (с использованием DoDragDrop ofc) – argh

+0

Часть обмена данными находится внутри DoDragDrop, поэтому, если вы хотите, чтобы exachange данных был асинхронным, тогда вы должны поместить DoDragDrop в другой поток. и он должен быть потоком STA. Вы знаете, как заставить поток быть STA в .NET? –

+0

Ну ... поправьте меня, если я ошибаюсь, но если у меня есть: [STAThread] статической силы основных (String []) параметры то это время работают в ГНА тему, не так ли? – argh

0

Он всегда будет зависеть, но задержка не заметна с небольшими файлами. Выезд this answer.

 Смежные вопросы

  • Нет связанных вопросов^_^