8

私は次のように外部アプリにドラッグドロップを実行しています:

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

// get files

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

一部のアプリはファイルを取得して処理に移り、私のアプリはそれを自由に実行できますが、一部のアプリはすべてのファイルを処理するまで私のアプリをフリーズさせます...それを回避する方法はありますか?私はスレッドでそれをやろうとしましたが、それはあまりうまくいきませんでした-それはまったく機能しませんでした...それで、このコードを作る方法の提案は私のアプリをハングさせませんか?

4

2 に答える 2

3

.NET Control.DoDragDrop は、Win32 API のワッパーにすぎません.. (それを待ちます).. DoDragDrop

したがって、同じ制限があります。DoDragDrop は、 を呼び出したスレッドからのみ呼び出すことができますOleInitialize。これにより、スレッドは STA (Single Threaded Apartment) タイプのスレッドになります。

これは STA スレッドでのみ使用でき、API 設計は同期的であるため、宛先アプリケーションのドロップ通知の処理に翻弄されます。これは OLE ドラッグ アンド ドロップの設計の一部に過ぎず、変更することはできません。(OLE ドラッグ アンド ドロップは、Windows アプリケーションにスレッドが存在する前の Windows 3x 時代に実際に設計されました)。

したがって、スレッドが STA スレッドである別のスレッド IFF でこれを機能させることができます。また、相互運用機能を使用してアンマネージDoDragDrop関数を呼び出す必要がある場合もあります。

于 2010-01-29T01:46:48.913 に答える
0

常にフリーズしますが、小さなファイルでは遅延は目立ちません。この回答を確認してください。

于 2010-09-15T23:09:32.057 に答える