I don’t know how to do this in .NET, but with normal Win32 programming, an object that implements the IDataObject interface can also implement the IAsyncOperation interface. IDropTarget can then use this interface to perform drag-n-drop in the background thread so that the source and target do not block during the actual transfer. The only problem is that the goal, not the source, decides whether to use it or not.
An alternative is to use “optimized relocation,” where IDataObject provides file names and IDropTarget moves files directly.
MSDN has information about this: Processing Shell Data Transfer Scripts .
Of course, this all the same means that you need to upload files before starting drag-n-drop. Cannot perform drag-n-drop to determine the target, and then load later. However, you can have IDataObject hold CFSTR_FILEDESCRIPTOR and CFSTR_FILECONTENTS (described here: Clipboard shell formats ), where CFSTR_FILEDESCRIPTOR populated from the information you used to populate the ListView, and CFSTR_FILECONTENTS uses the timestamped interfaces the actual delete operation, not before it. At least that’s how you upload only those files that really want the target, and you can skip the rest.
Pair with IAsyncOperation, and this can give you the final effect you're looking for.
source share