1

これは私が使用しているコードです。動作しますが、アプリケーションの ftp 部分に約 5 分かかります。

ファイル自体はそれほど大きくありませんが、アプリケーションを最適化したいので、ここから始めるのが最適だと思います。

私がやろうとしているのは、4 つの特定のファイルをダウンロードすることです。

ファイルサイズは次のとおりです。

1 - ~48MB 2 - ~856k 3 - ~25MB 4 - ~49MB

// BEGIN FTP 
                WebClient request = new WebClient();
                request.Credentials =
                       new NetworkCredential(this.userNameRTF.Text,
                                                this.passRTF.Text);


                string[] ftpFile = new string[4];
                ftpFile[0] = "1";
                ftpFile[1] = "2";
                ftpFile[2] = "3";
                ftpFile[3] = "4"; 


                foreach(string s in ftpFile) 
                {
                    string ftpFileName = s;                        


                    byte[] fileData =
                            request.DownloadData(this.ftpHost
                                                   + this.ftpPath.Text + ftpFileName);                  

                    FileStream file =
                        File.Create(@"\\nas03\customerftp\" + custName.Text + @"\" + ftpFileName);

                    file.Write(fileData, 0, fileData.Length);

                    file.Close(); 
                } 

ご協力ありがとうございました!

4

2 に答える 2

4

API を使用してこれらを処理しない理由:

WebClient request = new WebClient();
request.Credentials = new NetworkCredential(this.userNameRTF.Text,
                                            this.passRTF.Text);

string[] ftpFiles = new[] { "1", "2", "3", "4" };
var tasks = ftpFiles.Select(f => request.DownloadFileTaskAsync(
                         this.ftpHost + this.ftpPath.Text + ftpFileName,
                         @"\\nas03\customerftp\" + custName.Text + @"\" + ftpFileName));

Task.WaitAll(tasks.ToArray());

これにより、コードが簡素化されるだけでなく、ファイルのダウンロードと保存が同時に行われます。

最後の行を次のように切り替えることで、これを非同期メソッドにすることができます (.NET 4.5/C# 5)。

await Task.WhenAll(tasks);

.NET 4 を使用している場合は、古いDownloadFileAsync方法を使用できます。

WebClient request = new WebClient();
request.Credentials = new NetworkCredential(this.userNameRTF.Text,
                                            this.passRTF.Text);

var ftpFiles = new[] { "1", "2", "3", "4" };
var ce = new CountdownEvent(ftpFiles.Length);

request.DownloadFileCompleted += (o,e) => ce.Signal();

foreach(var file in ftpFiles)
    request.DownloadFileAsync(new Uri(this.ftpHost + this.ftpPath.Text + ftpFileName),
                         @"\\nas03\customerftp\" + custName.Text + @"\" + ftpFileName));

ce.Wait();
于 2013-10-25T22:08:46.393 に答える
1

ファイルがどこから来て、どの帯域幅で、どの帯域幅でどこへ行くのかを知る必要があります。数行のコードから、インターネット接続自体以外に明らかなボトルネックはないようです。帯域幅を使用してダウンロードできるデータ量を計算するだけです。

于 2013-10-25T22:11:50.140 に答える