0

クライアントをサーバーに接続すると、クライアントはいくつかの dll ファイルをサーバーにコピーし始めます。これが発生すると、コピーが完了するまでフォームが停止します (いくつかの大きなファイルがあります)。

このコピーをバックグラウンドで実行したいのは、ユーザーが引き続きフォームを操作できるようにするためです (参照ダイアログ ボックスを開くなど)。コピーが完了したことを確認します。

ここではスレッドが役立つと思いますが、私はスレッドが初めてであり、それがその方法であるかどうかもわかりません。

dll ファイルをコピーするためのコードは次のとおりです。

   private bool copyDllsToServer()
    {
        //string targetPath = @"\\" + remoteIpAddress + "\\" + userName + batchRunPath;
        string targetPath = "Z:\\nBatcher\\" + userName + batchRunPath;
        if (!Directory.Exists(targetPath))
            Directory.CreateDirectory(targetPath);
        else
        {
            Directory.Delete(targetPath, true);
            Directory.CreateDirectory(targetPath);
        }


        for (int i = 0; i < listOfFilesToCopy.Count; i++)
        {
            if (listOfPathToCopy[i].CompareTo(omekPath + shadersPath) == 0)
            {
                if (!Directory.Exists(targetPath + "Shaders"))
                    Directory.CreateDirectory(targetPath + "Shaders");
                if (!File.Exists(targetPath + "Shaders\\" + listOfFilesToCopy[i]))
                    File.Copy(listOfPathToCopy[i] + listOfFilesToCopy[i], targetPath + "Shaders\\" + listOfFilesToCopy[i], true);
            }
            else
            {
                if (!File.Exists(targetPath + listOfFilesToCopy[i]))
                    File.Copy(listOfPathToCopy[i] + listOfFilesToCopy[i], targetPath + listOfFilesToCopy[i], true);
            }

        }

        return true;
    }    

何か案は?

4

2 に答える 2

4

私はこれにaを使用しBackgroundWorkerます(基本的に、スレッドプールスレッドを素敵なコンポーネントにラップしてフォームにドロップし、UIスレッドへのマーシャリングを少し簡単にします)。必要に応じて、イベントを使用してコピー機能の進行状況を報告することもできます。

MSDNのチュートリアルについては、こちらを参照してください-http://msdn.microsoft.com/en-us/library/cc221403(v= vs.95 ).aspx

ただし、注意が1つあります。同時スレッドを使用するとディスクI/Oの問題が発生する可能性があるため、単一スレッドでのみ集中的なファイル操作を実行してください。

于 2013-01-31T14:44:26.547 に答える
0
        var bg = new BackgroundWorker();
        bg.DoWork += (s1,e1) => copyDllsToServer();

        bg.RunWorkerAsync();
于 2013-01-31T23:37:54.357 に答える