下载管理器 - 限制下载速度[重复]

2024-02-18

我需要为我的文件下载器应用程序实施下载速率限制,并且我查看了ThrottledStream来自 CodeProject 的类,但这在我的情况下不起作用,因为我必须能够在下载过程中更改限制,而不仅仅是在开始时。这是我在后台线程中使用的下载方法的一部分:

webResponse = (HttpWebResponse)webRequest.GetResponse();
responseStream = webResponse.GetResponseStream();
responseStream.ReadTimeout = 5000;

downloadCache = new MemoryStream(this.MaxCacheSize);
byte[] downloadBuffer = new byte[this.BufferSize];
int bytesSize = 0;
CachedSize = 0;
int receivedBufferCount = 0;

while (true)
{
    bytesSize = responseStream.Read(downloadBuffer, 0, downloadBuffer.Length);

    if (this.Status != DownloadStatus.Downloading || bytesSize == 0 
        || this.MaxCacheSize < CachedSize + bytesSize)
    {
        WriteCacheToFile(downloadCache, CachedSize);

        this.DownloadedSize += CachedSize;
        downloadCache.Seek(0, SeekOrigin.Begin);
        CachedSize = 0;

        if (this.Status != DownloadStatus.Downloading || bytesSize == 0)
            break;
    }

    downloadCache.Write(downloadBuffer, 0, bytesSize);
    CachedSize += bytesSize;

    receivedBufferCount++;
    if (receivedBufferCount == this.BufferCountPerNotification)
    {
        this.RaiseDownloadProgressChanged();
        receivedBufferCount = 0;
    }
}

我也看到有人使用 Thread.Sleep() 或 Thread.Wait(),但这是一个好主意吗?您对我如何在 while 循环内执行此操作有任何建议吗?


我已经使用此代码从服务器下载文件可能对您有帮助......

   private bool DownLoadFile(string pstrFileName, string pstrFilePath, long plngFileSize)
    {
        try
        {
            string strNewFileSize = CalcFileSize(plngFileSize);
            int numIterations = 0;  // this is used with a modulus of the sampleInterval to check if the chunk size should be adjusted.  it is started at 1 so that the first check will be skipped because it may involve an initial delay in connecting to the web service
            Offset = 0;
            long webConfigSetting = this.mobjService.GetMaxRequestLength();
            this.MaxRequestLength = Math.Max(1, (webConfigSetting * 1024) - (2 * 1024));    // set the max buffer size to slightly less than the request length to allow for SOAP message headers etc.  
            if (File.Exists(pstrFilePath))
            {
                Offset = new FileInfo(pstrFilePath).Length;
                if (Offset == plngFileSize)
                    Offset = 0;
                //File.Delete(pstrFilePath);
            }
            if (Offset == 0 && !File.Exists(pstrFilePath))   // create a new empty file
                File.Create(pstrFilePath).Close();

            // open a file stream for the file we will write to in the start-up folder
            lblFileName.Text = pstrFileName.Substring(0, pstrFileName.LastIndexOf(".")).Replace("&", "&&");
            using (FileStream fs = new FileStream(pstrFilePath, FileMode.OpenOrCreate, FileAccess.Write))
            {
                pbrSummary.Maximum = (int)plngFileSize;
                fs.Seek(Offset, SeekOrigin.Begin);
                // download the chunks from the web service one by one, until all the bytes have been read, meaning the entire file has been downloaded.
                while (Offset < plngFileSize)
                {
                    int currentIntervalMod = numIterations % this.ChunkSizeSampleInterval;
                    if (currentIntervalMod == 0)
                        StartTime = DateTime.Now;   // used to calculate the time taken to transfer the first 5 chunks
                    else if (currentIntervalMod == 1)
                        CalcAndSetChunkSize(plngFileSize);
                    try
                    {
                        // although the DownloadChunk returns a byte[], it is actually sent using MTOM because of the configuration settings. 
                        byte[] Buffer = mobjService.DownloadChunk(pstrFileName, Offset, ChunkSize);
                        fs.Write(Buffer, 0, Buffer.Length);
                        Offset += Buffer.Length;    // save the offset position for resume
                    }
                    catch (Exception ex)
                    {
                        if (ex.Message.Contains("File not found") || NumRetries++ >= MaxRetries)    // too many retries, bail out
                        {
                            fs.Close();
                            return false;
                            //throw new Exception("Error occurred during upload, too many retries.\r\n" + ex.Message);
                        }
                    }
                    numIterations++;
                    //----------------------- Code Commented ------------------------
                    //lblDownload.Text = CalcFileSize(Offset) + " of " + strNewFileSize;
                    //lblRate.Text = CalcFileSize(ChunkSize)+"/sec";
                    ////pbrSummary.Value = (int)Offset;
                    ////if ((int)Offset <= pbrSummary.Maximum)
                    ////    pbrSummary.Value = (int)Offset;
                    ////else
                    ////    pbrSummary.Value = pbrSummary.Maximum;
                    //------------------------------------------------------------------
                }
            }
            return true;
        }
        catch (Exception Exc)
        {
            throw (Exc);
        }
    }
    private void CalcAndSetChunkSize(long plngFileSize)
    {
        /* chunk size calculation is defined as follows 
         *      in the examples below, the preferred transfer time is 1500ms, taking one sample.
         *      
         *                                    Example 1                                 Example 2
         *      Initial size                = 16384 bytes   (16k)                       16384
         *      Transfer time for 1 chunk   = 800ms                                     2000 ms
         *      Average throughput / ms     = 16384b / 800ms = 20.48 b/ms               16384 / 2000 = 8.192 b/ms
         *      How many bytes in 1500ms?   = 20.48 * 1500 = 30720 bytes                8.192 * 1500 = 12228 bytes
         *      New chunksize               = 30720 bytes (speed up)                    12228 bytes (slow down from original chunk size)
         */
        double transferTime = DateTime.Now.Subtract(this.StartTime).TotalMilliseconds;
        double averageBytesPerMilliSec = this.ChunkSize / transferTime;
        double preferredChunkSize = averageBytesPerMilliSec * this.PreferredTransferDuration;
        this.ChunkSize = (int)Math.Min(this.MaxRequestLength, Math.Max(4 * 1024, preferredChunkSize)) * 10; // set the chunk size so that it takes 1500ms per chunk (estimate), not less than 4Kb and not greater than 4mb // (note 4096Kb sometimes causes problems, probably due to the IIS max request size limit, choosing a slightly smaller max size of 4 million bytes seems to work nicely)         

        //string statusMessage = String.Format("Chunk size: {0}{1}", CalcFileSize(this.ChunkSize), (this.ChunkSize == this.MaxRequestLength) ? " (max)" : "");
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

下载管理器 - 限制下载速度[重复] 的相关文章

  • 如何有效地测试action是否用属性(AuthorizeAttribute)修饰?

    我正在使用 MVC 并且有一种情况OnActionExecuting 我需要确定即将执行的Action方法是否用属性修饰 AuthorizeAttribute尤其 我不是问授权是否成功 失败 而是问该方法是否需要授权 对于非 MVC 人员
  • 合并多边形的高效算法

    我有一个多边形列表 在这个列表中 一些多边形重叠 或者接触其他多边形 我的任务是合并所有相互重叠或接触的多边形 我有一个union执行此操作的方法 做到这一点最有效的方法是什么 我目前能想到的是循环遍历多边形列表 检查合并列表以查看该多边形
  • 不要覆盖 Azure Blob 存储

    我有一种将文件添加到 Azure Blob 存储的方法 问题是我试图指定一个条件 在该条件下它不会覆盖 blob 而只是添加到其中 我正在尝试使用参数访问条件 但是 VS 说这个方法不能采用两个参数 async void archiveNe
  • 缓存友好的矩阵移位功能

    我想将二维方阵的第一行移到最后一行 所以如果我有一个像A这样的矩阵 我想要得到B 我可以使用两个简单的 for 循环来做到这一点 例如 void shift int M int N int A M N int i j temp for i
  • 有没有办法使用 ews c# 确定电子邮件是否是回复/响应?

    我正在编写一个支持系统 这是我第一次使用 EWS 到目前为止 我已经相当成功了 我可以提取我需要的信息 发送电子邮件 一切正常 我确实有点头疼 有没有办法判断电子邮件是否实际上是回复 该应用程序的基本思想是有人发送电子邮件 我们回复并给他们
  • 在“delete this;”语句期间发生了什么?

    请考虑以下代码 class foo public foo foo void done delete this private int x 以下两个选项中发生了什么 并且有效吗 选项1 void main foo a new foo a gt
  • 我应该始终使用 TryGetValue 来访问 .net 词典吗?

    In 另一个问题 https stackoverflow com questions 886814 why doesnt net provide us with the key when it raises a keynotfound ex
  • C#:如何确定坐标是否在美国大陆?

    我正在获取坐标 纬度 经度 我想检查这些坐标是否位于美国大陆 有没有一种简单的方法可以在 C 中实现 我可以将坐标转换为 MGRS 或 UTM 谢谢 哇哦 他们专门为你准备了 http econym org uk gmap states x
  • Magento SOAP V2 API - 附加属性设置为空

    几个小时以来 我一直在尝试通过 SOAP V2 API 创建具有附加属性的产品 每当我打电话时就会添加该产品目录产品创建但我随请求发送的附加属性被设置为空 每当我不添加附加属性时 这两个属性都会设置为其默认值 因此我认为这些属性正在发送和接
  • 调用 Console.ReadLine() 的方法的 C# 单元测试

    我想为名为的类的成员函数创建一个单元测试ScoreBoard它存储了一场比赛中排名前五的球员 问题是我为 SignInScoreBoard 正在呼叫Console ReadLine 这样用户就可以输入他们的名字 public void Si
  • CAS(代码访问安全)的目的是什么?

    我参与过很多 Web 应用程序 但从未使用过 CAS 也许也从未觉得有必要使用它 什么时候需要使用CAS 人们真的在他们的应用程序中使用它吗 CAS 实际上只在桌面应用程序中有用 可以这么说 在桌面应用程序中 您想要限制通过网络 例如 运行
  • 在 C++ 中运行 python [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个用 C 编写的应用程序和一个测试系统 也是用 C 编写的 测试系统非常复杂并且很难改变 我只想做一些小的改变 我的班级是这样的
  • 我们可以向 ServicePointManager.SecurityProtocol 添加四个协议吗?

    我想支持从 ssl3 到 tls 1 2 的所有安全协议 但是在网上搜索时我发现代码为 ServicePointManager SecurityProtocol SecurityProtocolType Ssl3 SecurityProto
  • 在运行时生成可执行文件

    好吧 所以我想知道如何创建一个程序 该程序创建第二个程序 就像大多数压缩程序如何创建自解压自可执行文件一样 但这不是我需要的 假设我有 2 个程序 每个都包含一个类 我将使用一个程序来修改类并用数据填充类 第二个文件将是一个也具有该类的程序
  • 如何使用 C# 以编程方式识别对方法的引用数量

    我最近继承了需要一些修剪和清理的 C 控制台应用程序 长话短说 该应用程序由一个包含超过 110 000 行代码的类组成 是的 单个类中有超过 110 000 行 当然 该应用程序是我们业务的核心 全天候运行更新动态网站上使用的数据 尽管我
  • 以编程方式将 UserControl 从 ContentControl 移动到另一个 ContentControl

    在 WPF 应用程序中 我想在代码中将 UserControl 从 ContentControl 移动到另一个控件 myContentControl2 Content myUserControl 在这种情况下我得到一个错误 指定的元素已经是
  • 通过 C++ 标头在 C++ 和 C# 中使用枚举

    我有一个用 C 编写的服务器 位于命名管道的末端 嗯 提供服务 可以发送到服务器的命令在位于头文件中的枚举中定义 enum e doThing1 e doThing2 e doLastThing 所需枚举的值被放入发送到服务器的消息的第一个
  • 如何同时正确使用管道和信号?

    我有 2 个孩子 我想将信号从孩子发送到父母 并将答案 随机数 为什么 为什么不 命名管道从父母发送到每个孩子 我有这个代码 include
  • 我的 C 程序无法运行,并显示“无法执行二进制文件:Exec 格式错误”

    我刚刚从 C 开始 我试图编译下面的代码并执行它 但出现错误 也在运行sizeBS 或数据堆栈中没有显示任何内容 include
  • 编写一个转储屏幕像素的 RDP 客户端

    我想在中实现 RDP 客户端C 它能够获取屏幕所有像素的颜色值并将它们转储到文件中 我知道这在概念上与 RDP 的工作方式不同 但我的应用程序需要它 我正在尝试利用freerdp https github com FreeRDP FreeR

随机推荐

  • 格式为 mm/dd/yyyy 但采用本地格式的最佳方式是什么?

    Excel 似乎没有这个功能 除非我错过了 但我们对此有需求 由于我们尝试匹配 Excel 的单元格格式语法 因此我想以一种有意义的方式添加它 那么 关于如何指定您想要在本地布局中格式化的短 中 长日期 时间 日期时间有什么建议吗 换句话说
  • 返回我的时间线中的所有推文

    我希望返回我在时间线上发布的所有推文 我正在使用Linq 到 Twitter https linqtotwitter codeplex com wikipage title Querying 20the 20User 20Timeline图
  • 将 C/C++ 代码从 Linux 移植到 Windows 的最佳环境

    我想让我的一个大项目可以在 Windows 平台上构建 该项目本身是用 C C 编写的 遵循 POSIX 标准 具有一些库依赖项 例如 libxml2 libcurl 等 我更像是一名 Linux 开发人员而不是 Windows 开发人员
  • 升级到 Azure SDK 2.6 后无法在 Windows 通用应用程序中加载共享“项目”

    我刚刚安装了2015 年 4 月发布 Azure SDK http azure microsoft com en gb downloads archive net downloads 它是 2 6 版本 之前我使用的是 2 5 版本 现在我
  • 将整个数据库的空字符串更新为 NULL

    我正在执行一些数据库清理 并注意到有很多列在各个列中同时具有空字符串和 NULL 值 是否可以编写一条 SQL 语句来将数据库中每个表的每一列的空字符串更新为 NULL 除了不允许 NULL 的列之外 我看过information sche
  • 仅在我为 GoogleCredential 对象设置了 setServiceAccountUser() 之后才出现 NullPointerException (Grails/Java)

    我收到一个NullPointerException当我尝试时 细节很少setServiceAccountUser ACCOUNT TO IMPERSONATE on my GoogleCredential 构建一个 Google 任务服务对
  • 如何从 Action Script 3.0 获知 Flash Player 版本

    有没有办法知道使用 Action Script 3 0 运行 SWF 文件的计算机上安装的 Flash 播放器版本 如果您在 IDE 中编程 则以下内容将为您提供版本 trace Capabilities version 如果您正在构建自定
  • Python ctypes - 接受结构的 dll 函数崩溃

    我必须在 ms windows xp 下访问 POS 终端 我正在使用Python 2 7 我加载的 DLL 中用于付款的关键函数接受两个指向结构的指针 但它崩溃并返回 1 通信错误 但没有进一步的消息 请注意 当调用支付函数时 并非 PO
  • 在 C++ 中, std::multiset 是否保持稳定的排序顺序?

    假设我有两个项目 a 和 b 它们比较相同 所以 a 我检查了一些参考资料 但找不到答案 我很想认为没有任何保证 并且取决于每个特定的实现 Thanks 这个线程 https web archive org web 201305091636
  • 自定义安装处理程序的 Eclipse p2 替代方案

    在 p2 之前 人们可以编写一个自定义安装处理程序 该处理程序具有在安装过程中执行任何 自定义 任务的功能 我发现 p2 不再支持自定义安装处理程序 我不断听说 自定义接触点 正在取代它 但是我找不到任何具体的示例 文档 谁能告诉我如何使用
  • 如何在预发布测试中从 TestFlight 应用程序检索崩溃日志

    我一直在尝试获取通过 iTunes Connect TestFlight 分发的应用程序的崩溃报告 但无法找到它们 我找到了这个线程 https stackoverflow com questions 29408003 test fligh
  • 如何在 Telegram 中应答回调查询后发送消息?

    我正在尝试用 PHP 开发一个 Telegram 机器人 但当用户按下内联按钮时 我无法让我的机器人回答用户 有人可以帮我发消息吗 sendMessage方法 调用后answerCallback method 这是我最后的试用代码 if c
  • 在 spritekit 中沿着 UIBezierPath 绘制节点

    我目前正在 spritekit 中开发一款游戏 其中有游戏关卡地图 我正在使用 UIBezierPath 作为我希望关卡节点遵循的路径 我遇到的唯一问题是尝试沿路径绘制它们 并且想知道如何将它们添加到场景中 以便将它们添加到路径中每一个都与
  • 如何修复:使用 nginx 反向代理时收到 RST_STREAM,错误代码为 2

    我目前正在树莓派上使用dialogflow api 使用 grpc 调用 StreamingDetectIntent 方法时一切正常 我必须在我的产品上使用多个 api 因此 我尝试在它们前面放置一个反向代理 这样我就只能调用一个地址 我正
  • 测试监听 webhook 的 Laravel 路由

    似乎我在这里遗漏了一些东西 但我正在努力为集成 SendOwl webhook 的 Laravel 实现测试 这是我正在使用的文档 https help sendowl com help using web hooks https help
  • 分发java应用程序

    我最近开发了一些java应用程序 我希望其他人可以在他们的机器上运行 我做了一些研究 现在知道要分发 java 代码 您需要创建 jar 文件 好吧 我这样做了 但是当我分发这些文件时 它在某些计算机上运行 但在其他计算机上它返回一个错误
  • 图(图表)算法

    有人有计算轴最小值和最大值的不错的算法吗 当为给定的一组数据项创建图表时 我希望能够给出算法 集合中的最大值 y 集合中的最小值 y 轴上显示的刻度线数量 一个可选值must显示为勾号 例如 显示 ve 和 ve 值时为零 该算法应该返回
  • 如何从 Node.js 应用程序访问浏览器的窗口对象?

    我正在尝试编写一个简单的应用程序来监视文件更改并自动在浏览器中重新加载更新的代码 我知道 livereload nodeamon 和其他的存在 我只是想编写自己的 我已经创建了服务器 让它读取我想要读取的文件 调用观察程序 当监视文件中发生
  • Android 如何读取 BLE 属性 可读 可写 可通知 GATT 特性

    如何阅读BluetoothGattCharacteristic属性如特征Readable Writable or Notifiable return Returns b true b if property is writable publ
  • 下载管理器 - 限制下载速度[重复]

    这个问题在这里已经有答案了 我需要为我的文件下载器应用程序实施下载速率限制 并且我查看了ThrottledStream来自 CodeProject 的类 但这在我的情况下不起作用 因为我必须能够在下载过程中更改限制 而不仅仅是在开始时 这是