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

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(使用前将#替换为@)

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

  • 游戏网络射弹实施/概念问题[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在尝试找到某种解决方案来解决同步射弹射击和游戏网络的常见问题 但我不确定什么是最合适的 这是一款 2D 动作横向卷轴游戏 带有多个射弹 没有即时攻
  • 为什么 std::move() 没有窃取 int 值? [复制]

    这个问题在这里已经有答案了 std move 正在窃取字符串值 而不是 int 请帮助我 int main int i 50 string str Mahesh int j std move i string name std move s
  • 类库的 app.config 中的绑定重定向有什么作用吗?

    我经常使用的 VS 解决方案包括单个可执行项目 控制台应用程序 网络应用程序 和许多类库项目这些都被可执行文件引用 使用 NuGet 并安装包时 经常会出现app config为每个项目创建的文件 通常只包含合并引用程序集版本的绑定重定向列
  • 如何访问 TabControl 选项卡内的控件?

    这就是我到目前为止所拥有的一切 tabControl1 TabPages 0 我的 TabControl 的 TabPage1 中有一个 PictureBox 如何使用代码而不是属性窗格更改图像位置 尽管控件出现在容器内 作为 TabCon
  • 从 QFile 获取句柄

    我有一个QFile 但我需要在其上调用一些仅接受HANDLE 有没有办法找回底层HANDLE of the QFile 我找到了一种使用的方法 get osfhandle 在 MinGW 和 VS 中可用 QFile file HANDLE
  • 将委托作为方法参数传递

    我目前正在开发一个 EventManager 类 以确保没有任何事件连接到失效的 WCF 双工客户端 并控制防止从同一客户端到一个事件的多个连接 现在基本上 我所坚持的就是尝试将事件委托传递给一个函数来控制这样的分配 var handler
  • Promise.defer 的正确模式是什么?

    我正在使用 TypeScript 和async await来表示异步工作流程 该工作流程的一部分是调用 Web Worker 并在其回调结果时继续 在 C 中 我会创建一个TaskCompletionSource await its Tas
  • 以十六进制打印字符串? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这种以十六进制打印字符串的简短方法是
  • 如何使用 MonoTouch c# 以编程方式获取联系人?

    如何获取 iPhone 中的联系人 我需要从 iPhone 联系人中获取所有属性 如何使用MonoTouch以编程方式实现 ABAddressBook iPhoneAddressBook new ABAddressBook ABPerson
  • C# 中 a+=1 和 a=a+1 的区别

    我发现在C 中a 1不等于a a 1 例如 以下代码编译时不会出现任何错误 字节 b 10 b 5 而下面的代码有编译错误 字节 b 10 b b 5 有人可以告诉我为什么吗 Because b 5变成整数 Int32 主要是因为有重载的可
  • 如何在asp.net中创建动态复选框

    我正在创建一个需要添加动态复选框列表的应用程序 请任何人告诉我如何使用 C 添加动态复选框列表 在表单上放置一个带有 ID 的占位符placeHolder并将以下代码添加到您的Page Load CheckBoxList cbList ne
  • 如何在 .NET 中使 ComboBox 不可编辑?

    我想要一个 仅选择 ComboBox它提供了一个项目列表供用户选择 应在文本部分禁用打字ComboBox控制 我最初对此进行谷歌搜索 发现了一个过于复杂 误导性的建议来捕捉KeyPress event 要使 ComboBox 的文本部分不可
  • 如何从 Visual Studio 2012 导出 C# 应用程序以在其他计算机上运行?

    我刚刚在 Visual Studio 2012 中制作了我的第一个 C 应用程序 我想以某种方式导出它 以便其他人可以在他们的计算机 包括没有 Visual Studio 2012 的计算机 中使用它 我该怎么做 我是 C 新手 找不到任何
  • 调用服务时Request.InputStream为空

    我正在开发 ASP NET 4 5 应用程序 并且遇到了一个非常烦人的问题 迁移到 VS2012 后我们遇到了同样的问题here https stackoverflow com questions 12391586 visual studi
  • 链接到 C++ 库时在 C 中使用 setjmp 和 longjmp

    我想在链接到用 C 实现的库 但具有 C API 的 C 程序中使用 setjmp 和 longjmp C 代码确实进行动态内存分配 并且指针通过 API 传递 但只要代码的 C 端正确管理这些 不透明 对象 使用 longjmp 时就不应
  • 如何在 Code::Blocks 中启用 C 自动完成?

    如何在 Code Blocks 中启用 C Std lib 函数自动完成 转到 设置 gt 编辑器 gt 代码完成和符号浏览器 并确保未选中 禁用代码完成
  • 从 C# 2.0 中的 dll 获取命名空间、类名

    我将动态获取dll 我需要加载 dll 并获取命名空间 类名来调用方法 方法名称是静态的 它将始终为 OnStart 基本上我需要通过加载 dll 来运行一个方法 有人可以帮忙吗 要加载程序集 您可以这样做 Assembly assembl
  • WPF 媒体格式

    WPF 是否内置对任何音频和视频格式的支持 我将使用 MediaPlayer 和 MediaElement 类来构建一个小型媒体播放器 目前 我不想处理 NET 没有本机支持的编解码器和格式 WPF 默认支持视频格式 WMV MPEG 和一
  • 使用 EPplus 在 Excel 中添加下拉菜单

    我需要帮助 如何使用 Epplus 在 Excel 中添加下拉列表 无需验证 我只需要把它添加到我的模板中 下拉列表中的记录不是动态的 using ExcelPackage p new ExcelPackage ExcelWorksheet
  • 使用对象初始化语法的操作顺序

    我使用对象初始值设定项语法设置属性的顺序是否以完全相同的顺序执行 例如 如果我这样做 var s new Person FirstName Micah LastName Martin IsLoaded true 每个属性都会以相同的顺序设置

随机推荐

  • 格式为 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 的类 但这在我的情况下不起作用 因为我必须能够在下载过程中更改限制 而不仅仅是在开始时 这是