1

このプロジェクトについての私の考えをデバッグする必要があります。

私は、フォルダを指定して、そのすべてのファイルとフォルダを別の場所にコピーするバックアップマネージャプロジェクトを作成しました。

動作します(コピージョブは正常に実行されます)が、約1分かかるコピー中にアプリケーションUIが応答しません。スレッドについて聞いたことがあり、並列プログラミングという言葉を見てきました(言葉だけでそれ以上はありません)。今度は、コードを切り替えることができるようになるための説明、比較、例が必要です。

私は以前にスレッドを使って非常に単純なアクションを実行しましたが、それはかなり前のことであり、スレッド化に十分な自信がありません。これが私のコードです:

private void CopyFiles(string path, string dest)
{
    System.IO.Directory.CreateDirectory(dest + "\\" + path.Split('\\')[path.Split('\\').Count()-1]);
    dest = dest + "\\" + path.Split('\\')[path.Split('\\').Count() - 1];
    foreach (string file in System.IO.Directory.GetFiles(path))
    {
        System.IO.File.Copy(file, dest + "\\" + file.Split('\\')[file.Split('\\').Count() - 1]);
    }
    foreach (string folder in System.IO.Directory.GetDirectories(path))
    {
        CopyFiles(folder, dest);
    }
}

これを特別な間隔に基づいたタイマーで実行します。スレッドを使用する場合、タイマーを省略する必要がありますか?私を導いてください、私は混乱しています。

4

4 に答える 4

1

スレッド化に十分な自信がないので、Joe Albahari の Threading in C# Tutorialを読むことを強くお勧めします。並列プログラミングとは、複数の操作を「並列」または同時に実行することです (主に、複数の CPU または GPU コアに大量の計算を分散させるため)。この場合、すべてのファイルをコピーしている間、スレッド化により UI をレスポンシブにする必要があります。基本的に、次のように設定します: (C# チュートリアルのスレッドを読んだ後)

Thread copyFilesThread = new Thread(() => 
{
    CopyFiles(path, dest);
});
copyFilesThread.Start();

UI は独自のスレッドで実行されます。アプリケーションに挿入されるすべてのコードは、UI スレッドで実行されます (明示的にスレッド化を使用していない場合)。このCopyFilesメソッドは時間がかかるため、コピー ジョブが完了するまで UI を停止します。スレッド化を使用すると、UI スレッドとは別のスレッドで が実行CopyFilesされるため、UI スレッドがレスポンシブになります。

編集: タイマーはどのくらいの頻度で実行されますか?

于 2012-12-24T07:52:33.403 に答える
1

スレッドがいつ完了したかを知ることができる別の専用スレッドで操作を実行する簡単な方法は、BackgroundWorkerを使用することです。

使用例は、上でリンクしたページにあります。

于 2012-12-24T07:59:04.390 に答える
1

大量または不明な量のファイルをコピーする場合は、ThreadPool を使用する必要があります

 ThreadPool.QueueUserWorkItem(delegate
 {
    CopyFiles(folder, dest);
 });
于 2012-12-24T08:30:26.467 に答える
0

バックグラウンド ワーカーを使用して、非同期実行を実装できます。このリンクは http://www.codeproject.com/Articles/20627/BackgroundWorker-Threads-and-Supporting-Cancelに役立つ場合があります

于 2012-12-24T07:59:20.303 に答える