דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. הורדה מהירה של קבצים מרובים C#

הורדה מהירה של קבצים מרובים C#

מתוזמן נעוץ נעול הועבר ארכיון code613m
1 פוסטים 1 כותבים 208 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    אבי
    כתב ב נערך לאחרונה על ידי
    #1

    אני צריך להוריד כמות גדולה של קבצים מאתר מסוים.
    אני משתמש בקוד הבא מכאן

    class DownloadState
    {
        public readonly Uri Uri;    
        public readonly string Filename;
        public readonly WebClient Client;
        public DownloadState(string u, string f, WebClient c)
        {
            Uri = new Uri(u);
            Filename = f;
            Client = c;
        }
    }
    
    const int MaxConcurrentDownloads = 6;
    BlockingCollection<string> UrlsToDownload =
    new BlockingCollection<string>();
    
    // AddUrlsToDownload populates the UrlsToDownload collection.
    AddUrlsToDownload(UrlsToDownload);
    
    // Mark the collection as complete for adding.
    UrlsToDownload.CompleteAdding();
    
    // Now, start the downloads.
    for (int i = 0; i < MaxConcurrentDownloads; ++i)
    {
        var client = new WebClient();
        client.DownloadProgressChanged = DownloadProgressChanged;
        client.DownloadFileCompleted = DownloadFileCompleted;
        StartDownload(client);
    }
    
    void StartDownload(WebClient client)
    {
        string url;
        if (UrlsToDownload.TryTake())
        {
            string fname = CreateDownloadFilename(url);
            var state = new DownloadState(url, fname, client);
            // start the asynchronous download.
            client.DownloadFileAsync(state.Uri, fname, state);
        }
        else
        {
            // Couldn't get a url. The queue is empty.
            // Dispose the WebClient instance.
            client.Dispose();
        }
    }
    

    בקוד הזה יש הגדרה לכמות ה client שיפעלו בו זמנית בצורה אסינכרונית, אבל גם כשאני מגדיר לו כמות גדולה מאוד של הורדות בו זמנית, וגם אם אוריד את ההגבלה הזו לגמרי, עדיין זה מתחיל את ההורדה במהירות של 7.5 KB לשניה ויורד ל 0.5 KB לשניה מה שעושה את ההורדה מאוד מאוד איטית... :roll:
    הבנתי שזה הגבלה בשרת, איך אפשר לבדוק את זה, ומהם הפתרונות אם יש?

    שאלה נוספת:
    אחרי שהקבצים יורדים אני מחלץ אותם וממיר אותם לפורמט אחר שנכנס ישירות לדטה בייס, ישנה אפשרות להשתמש ב DownloadDataAsync ולהוריד את הקובץ לתוך מערך byte ו'לטפל' בו מיידית בלי לשמור אותו כקובץ ורק אח"כ לפתוח את הקובץ, השאלה האם זה באמת חוסך זמן משמעותי ושווה את הבלגן שנוצר מהמערכים שצריכים להשמר עם שם הקובץ וכו'?

    תודה לכולם.

    פורסם במקור בפורום CODE613 ב28/12/2015 22:38 (+02:00)

    תגובה 1 תגובה אחרונה
    0

    בא תתחבר לדף היומי!
    • התחברות

    • אין לך חשבון עדיין? הרשמה

    • התחברו או הירשמו כדי לחפש.
    • פוסט ראשון
      פוסט אחרון
    0
    • דף הבית
    • קטגוריות
    • פוסטים אחרונים
    • משתמשים
    • חיפוש
    • חוקי הפורום