WebRequest.GetResponse() blockiert bei mehreren Zugriffen



  • Hi,
    ich hab ein Problem mit WebRequest.GetResponse().

    Und zwar hab ich z.B. 3 Threads laufen. In jedem hole ich mir die WebResponse durch WebRequest.GetResponse() zu einem Datei-Link (http) und lade dann die Datei mithilfe WebResponse.GetResponseStream() herunter.
    ServicePointManager.DefaultConnectionLimit ist auf 3 gesetzt.

    Das Problem ist nun, dass er manchmal alle 3 Dateien gleichzeitig runterlädt, so wie es sein sollte. Aber manchmal, läuft nur 1 Download, und die anderen Threads hängen bei dem Aufruf WebRequest.GetResponse() fest, bis der andere Download fertig ist. Nach jedem fertigen Download wird der ResponseStream und die WebResponse geschlossen (Close()).
    Scheinbar liegt eine race-condition vor; aber ich verstehs trotzdem nicht, warum er es schafft, manchmal, alle 3 Downloads zu initiieren, und manchmal eben nicht? Am Server kanns eigtl. nicht liegen, weil eben manchmal 3 Downloads laufen... 😕
    Ach ja, die 3 Dateien liegen auf dem selben Server.

    Der Code:

    static public WebResponse GetUrlResponse(string Url)
        {
          // Setup the Request.
          WebRequest Request = WebRequest.Create(Url);
          Request.Credentials = CredentialCache.DefaultCredentials; // Standard authentification.
    
          if (Request is HttpWebRequest)
          {
            HttpWebRequest HttpRequest = (HttpWebRequest)Request;
            HttpRequest.UserAgent = "TestAgent";
          }
    
          // Get the Response.
          WebResponse ToReturn = Request.GetResponse();
          if (ToReturn == null)
            throw new NullReferenceException("GetResponse() returned a null-reference.");
    
          return ToReturn;
        }
    
    public bool DownloadFile(TransferBackgroundWorker TransferWorker, int DownloadIndex)
        {
          ...
          m_DownloadStream = m_Response.GetResponseStream();
          int DOWNLOAD_CHUNK_SIZE = 2048;
          ...
    
          byte[] ReadBytesBuffer = new byte[DOWNLOAD_CHUNK_SIZE];
          int NumReadBytes = 0;
          int TotalNumDownloadedBytes = 0;
    
          try
          {
            // Loop until all bytes are downloaded and written.
            while ((NumReadBytes = m_DownloadStream.Read(ReadBytesBuffer, 0, DOWNLOAD_CHUNK_SIZE)) > 0)
            {
              // Write the bytes.
              m_FileStream.Write(ReadBytesBuffer, 0, NumReadBytes);
    
              // Check for cancel.
              if (TransferWorker.CancellationPending)
                return false;
    
              // Report the progress.
              TotalNumDownloadedBytes += NumReadBytes;
              TransferWorker.ReportDownloadStatus(DownloadIndex, TotalNumDownloadedBytes);
            }
    
            // Report success.
            TransferWorker.ReportFileWasDownloaded(DownloadIndex);
          }
          catch(Exception ex)
          {
            TransferWorker.ReportDownloadFailure(DownloadIndex, ex.Message);
          }
          return true;
        }
    

    Ein Sleep() in die Download-Schleife einzubauen, bringt leider auch nichts.



  • Gugi schrieb:

    Am Server kanns eigtl. nicht liegen, weil eben manchmal 3 Downloads laufen...

    Das ist ein Fehlschluß, Stichwort: "manchmal". Wenn etwas manchmal läuft bedeutet es nicht, das es immer läuft. Könnte ebenso Zufall sein das es "manchmal" funktioniert...

    Gugi schrieb:

    Scheinbar liegt eine race-condition vor;

    Vorraussetzung für eine Race-Condition ist, das alle drei Threads auf gemeinsame Resourcen zugreifen. Ist das der Fall? (lässt sich aus dem Minimalbeispiel nicht wirklich rauslesen).



  • loks schrieb:

    Das ist ein Fehlschluß, Stichwort: "manchmal". Wenn etwas manchmal läuft bedeutet es nicht, das es immer läuft. Könnte ebenso Zufall sein das es "manchmal" funktioniert...

    Mh, d.h., du meinst, dass der Server "manchmal" einfach nicht genügend Verbindungen zur Verfügung stellen kann?

    loks schrieb:

    Vorraussetzung für eine Race-Condition ist, das alle drei Threads auf gemeinsame Resourcen zugreifen. Ist das der Fall? (lässt sich aus dem Minimalbeispiel nicht wirklich rauslesen).

    Naja, die einzige gemeinsame Resource ist eigtl. die Netzwerkverbindung. Der Code enthält im Prinzip den kompletten Netzwerkcode, den ich verwende.

    Kann das Problem nur am Server selbst liegen, oder auch an irgendeiner Einstellung beim Client?


Anmelden zum Antworten