2017-11-01 8 views
1

私のアプリケーションはWindowsエクスプローラのように機能し、listviewから多くの項目を選択してからtreeviewの別のディレクトリにドラッグアンドドロップする必要があります。リストビューの選択項目からC#の別のディレクトリに多くのファイルを移動する

listview(選択された1000個のファイルを選択します)の選択から大量のファイルを転送しようとしているときに、アプリケーションがフリーズして、ほんの数個のファイルだけが正常に転送されます。ただし、一度に少量のファイルを移動することに問題はありません。ここで

は、それが選択したリスト項目をループし、それらを移動私のコードの抜粋です:

var lvi = (ListView.SelectedListViewItemCollection)e.Data.GetData("System.Windows.Forms.ListView+SelectedListViewItemCollection"); 

foreach(ListViewItem item in lvi) 
{ 
var originPathObj = item.Tag; 
var originPathFileType = item.SubItems[1].Text; 

if(originPathFileType == "File") 
{ 
    var originDirInfo = (FileInfo)originPathObj; 

    string originPath = originDirInfo.FullName; 
    string originFileName = originDirInfo.Name; 

    var destinationDirInfo = (DirectoryInfo)dn.Tag; 
    string destinationPath = destinationDirInfo.FullName; 
    string destinationPathWithFile = destinationPath + "\\" + originFileName; 

     if (File.Exists(originPath) && Directory.Exists(destinationPath)) 
     { 
      FileSystem.MoveFile(originPath, destinationPathWithFile, UIOption.AllDialogs); 
     } 
} 
} 

誰もが私が正常にファイルを移動することができ、より良い方法を知っていますか?私はオンラインで検索しましたが、見つけたのは、私がすでに行ったことを提案している人でした。これはforeachループのFile.Moveコードです。

ファイルを移動するときにも、FileSystem.MoveFile(originPath, destinationPathWithFile, UIOption.AllDialogs);が既にプログレスバーを持つダイアログを提供します。しかし、少量のファイルを移動すると、結果が瞬時になり、Windowsエクスプローラで1000個のファイルを移動すると、プログレスバーが一時的に表示されます。これはアプリでも実現したいものです。

答えて

0
Task.Run(() => 
{ 
    YourLongRunningFunc(); 
}); 

YourLongRunningFunc()にあなたのロジックをすべて投稿してください。これにより、UIが反応し、凍ったUIが目立たなくなります。

+0

私はforeachループ内のロジックをオリジナルの投稿からタスクに移動し、同時に開始しています。良いニュースは、進捗バーが現れ、ファイルが転送されていることを知っていますが、悪いニュースは多くの実行アクションが作成されているためです。ダイアログには実際には「XからYへの1アイテムの移動」とにかく、私が移動しているすべてのファイルを統合して、ファイルエクスプローラのように1つのプログレスバーにまとめることができますか?プログレスバーに「XからYまで700個のアイテムを移動する」のように表示したい場合 –

+0

あなた自身で実行して、自分の進行状況バーを作成することができます。それは複雑さの問題です。 – David

関連する問題