Я пытаюсь перетащить элемент в проводник.
Элемент должен привести к загрузке файла, поэтому я использовал пример, который я нашел в Интернете, для загрузки файла с помощью CustomDataObject
, который вызывает событие, когда ему действительно нужен поток, а затем мое приложение выполняет тяжелую работу. поднимает и выполняет загрузку.
Он работал очень хорошо в аналогичной операции с буфером обмена.
Фактическая загрузка файла также вызывает некоторые изменения пользовательского интерфейса в моем приложении. В большинстве случаев на форме меняется «рабочий» значок, а также всплывающее окно в случае ошибки.
В операции с буфером обмена я просто использовал InvokeRequired
и BeginInvoke
, когда это необходимо, чтобы изменения в пользовательском интерфейсе происходили в основном потоке. В операции перетаскивания поток пользовательского интерфейса ожидает возврата из DoDragDrop
, в то время как событие, вызываемое CustomDataObject
, вызывается в другом потоке. Когда я пытаюсь вызвать BeginInvoke
или Invoke
, поток пользовательского интерфейса все еще ждет, и я не могу завершить удаление.
Существует ли какой-либо пример или рекомендуемый лучший способ разрешить перетаскивание между приложениями при одновременном доступе к пользовательскому интерфейсу исходного приложения?
UPDATE
здесь - это оригинальная статья CodeProject с DataObjectEx
, которую я модифицировал для собственного использования. Я просто изменил метод GetFileContents
для вызова виртуального метода, который возвращает Stream
, содержащий данные файла, унаследованные от класса, и переопределил этот виртуальный метод для получения файла из Интернета.
Проблема возникла, когда я хотел что-то изменить в пользовательском интерфейсе при получении файла. Как я уже говорил ранее - основной поток пользовательского интерфейса все еще «застрял» при вызове метода DoDragDrop
, поэтому я не могу вовремя вызвать его, чтобы внести изменения в пользовательский интерфейс, необходимые рабочему потоку до и после загрузки файла.