Upload mehrerer Dateien effizient asynchron mit ftp c#

Habe ich ein Szenario wie dieses

while ( until toUpload list empty)
{
   create ftp folder (list.item);

   if (upload using ftp (list.item.fileName))
   {
     update Uploaded list that successfully updated;
   }
}

update database using Uploaded list;

Hier habe ich synchrone Methode zum hochladen von Datei in dieser Schleife. Und ich bekam eine Anforderung optimieren Sie diese hochladen. Ich fand diesen Artikel Wie zur Verbesserung der Leistung von FtpWebRequest? und befolgt die Anweisungen, die Sie zur Verfügung gestellt haben. Deshalb habe ich erreicht 2000 Sekunden bis 1000 Sekunden Zeit. Dann bewege ich mich in der upload mit asynchron-wie in diesem Beispiel in der msdn. http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest(v=vs. 90).aspx. Ich habe geändert, die Methode

if (upload using ftp (list.item.fileName)) 

zu

if (aync upload using ftp (list.item.fileName))

Aber die Dinge wurden schlimmsten. Zeit werden 1000 bis 4000.

Habe ich zu viele Datei-upload auf meinen ftp-server. Daher am besten Verfahren werden soll (raten) asynchron. Mir jemand helfen, wie dies zu tun in der richtigen Art und Weise. Ich war nicht in der Lage zu finden, wie oben verwenden msdn Beispiel-code korrekt.

Mein code - synchrone (Ausnahmebehandlung entfernt, um Platz zu sparen):

public bool UploadFtpFile(string folderName, string fileName)
{     
  try
  {
    string absoluteFileName = Path.GetFileName(fileName);           

    var request = WebRequest.Create(new Uri(
      String.Format(@"ftp://{0}/{1}/{2}",
         this.FtpServer, folderName, absoluteFileName))) as FtpWebRequest;
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UseBinary = true;
    request.UsePassive = true;
    request.KeepAlive = true;
    request.Credentials = this.GetCredentials();
    request.ConnectionGroupName = this.ConnectionGroupName; 
    request.ServicePoint.ConnectionLimit = 8; 

    using (FileStream fs = File.OpenRead(fileName))
    {
      byte[] buffer = new byte[fs.Length];
      fs.Read(buffer, 0, buffer.Length);
      fs.Close();
      using(var requestStream = request.GetRequestStream())
      {
        requestStream.Write(buffer, 0, buffer.Length);
      }
    }

    using (var response = (FtpWebResponse)request.GetResponse())
    {
        return true;
    }
  }
  catch //real code catches correct exceptions
  {
     return false;  
  }
}

async-Methode

public bool UploadFtpFile(string folderName, string fileName)
{     
  try 
  {
    //this methods is exact method provide in msdn example mail method
    AsyncUploadFtp(String.Format(@"ftp://{0}/{1}/{2}", 
      this.FtpServer, folderName, Path.GetFileName(fileName)), fileName);

    return true;
  }
  catch //real code catches correct exceptions
  {
     return false;  
  }
}
  • 10s bedeutet nichts, leider... Was ist die Geschwindigkeit, die Sie erwarten (also Datei Größe/max upload-speed)? Wissen Sie, wenn Sie tatsächlich senden Sie viel mehr Daten als Sie jetzt tun? (auch, um vernünftige Ratschläge auf Ihren code, den Sie brauchen, um zu zeigen, Probe, die zumindest Aussehen wie C# - code).
  • Ich Hinzugefügt mein code um die Frage, wissen Sie, wenn Sie tatsächlich senden Sie viel mehr Daten als Sie jetzt tun? Ich reduzierte 20s auf 10s oben genannten Beispiel sagen, er reduziert es 5s mit async-Methode. In der Allgemeinen Umgebung, die ich in der Lage sein, dasselbe zu tun, denn ich habe den ersten Erfolg. Bitte geben Sie mir einige Ratschläge.
  • Tipp 1: beim posten von code, um es so klein wie möglich und so sinnvoll wie möglich - d.h. du gepostet hast synchrone upload-code für eine einzige Datei und keine iteration code noch async-version (wo die meisten wahrscheinlich Probleme mit async wird langsamer wird). Rat 2: Messen Sie Ihre maximale upload-Geschwindigkeit unabhängig von Ihrem code. Ratschlag 3: legen Sie Ihre Ziele - "10s langsam" ist man nicht, so etwas wie "bis zu 1000 Dateien mit max Gesamtgröße 1 TB hochgeladen werden soll unter 3 Sekunden" werden könnte. Rat 4: Profil code.
  • Wie viele Dateien Ihr hier redet? Wenn Sie haben eine Menge Dateien, der server möglicherweise nicht in der Lage, alle auf einmal, und Sie könnten schlagen timeouts/Wiederholungen oder möglicherweise Kontextwechsel...
  • Ich rufe UploadFtpFile Methode in einer Schleife. Wenn asyn Stimmung, die ich rufe asynchmethod. So ist es auch in einer Schleife. 10s ist die test-Zeit. Tatsächliche Zeit dauert fast 3 Stunden. der link, den ich bin mit mir upload-Geschwindigkeit 30kBps für eine Datei (link ist 128 kbit / s). Im asynchronen Methode wird 15 kBps. Vergessen 10s Sache, Es s wirklich nutzloses Ding.
  • 1) Ihr server möglicherweise nicht in der Lage zu handhaben die Menge der eingehenden verbindungen. 2) Ihre internet-Geschwindigkeit kann ein Faktor sein, ebenso wie die server-Verbindung, die Annahme der Dateien. 3) denken Sie daran, wenn Sie beim hochladen von mehreren Dateien gleichzeitig, die upload-Geschwindigkeit ist verteilt auf die Dateien. Sie alle werden NICHT upload mit der gleichen Geschwindigkeit.

InformationsquelleAutor cdev | 2013-02-14
Schreibe einen Kommentar