当前位置: 首页 > 编程语言 > C#

快速高效地下载多个文件(异步)分享

时间:2023-04-10 22:49:01 C#

快速高效地下载多个文件(异步)我的文件太多了,我要下载。所以我尝试使用如下新的异步函数。varstreamTasks=urls.Select(asyncurl=>(awaitWebRequest.CreateHttp(url).GetResponseAsync()).GetResponseStream()).ToList();varstreams=awaitTask.WhenAll(streamTasks);foreach(varstreaminstreams){使用(varfileStream=newFileStream("blabla",FileMode.Create)){awaitstream.CopyToAsync(fileStream);我担心这段代码会导致大量内存使用,因为如果有1000个文件包含2MB文件,那么这段代码会将1000*2MB流加载到内存中?我可能遗漏了什么,或者我是完全正确的。如果我没有遗漏任何东西,等待每个请求并使用流的最佳方式是什么?这两种选择都可能有问题。一次只下载一个不会扩展并且需要时间,而一次下载所有文件可能是一个负载太多(也就是说,在处理它们之前不等待所有文件下载)。我更喜欢用可配置的大小来限制这种操作。一种简单的方法是使用AsyncLock(它使用SemaphoreSlim)。一种更可靠的方法是将TPL数据流与MaxDegreeOfParallelism结合使用。varblock=newActionBlock(url=>{varstream=(awaitWebRequest.CreateHttp(url).GetResponseAsync()).GetResponseStream();using(varfileStream=newFileStream("blabla",FileMode.Create)){awaitstream.CopyToAsync(fileStream);}},newExecutionDataflowBlockOptions{MaxDegreeOfParallelism=100});无论您是否使用异步,您的代码都会将流加载到内存中。执行异步工作通过返回到调用者直到ResponseStream返回来处理I/O部分。你必须选择不关注异步,而是做一些关于读取大量输入流的事情。如果我是你,我会考虑如何将工作量分成块。您可以并行读取ResponseStream并将每个流保存到不同的源(可能是文件)并从内存中释放。这是我自己对YuvalItzchakov的分块想法的回答,我提供了实现。请提供有关此实施的反馈。foreach(varchunkinurls.Batch(5)){varstreamTasks=chunk.Select(asyncurl=>awaitWebRequest.CreateHttp(url).GetResponseAsync()).Select(asyncresponse=>(awaitresponse).GetResponseStream());varstreams=awaitTask.WhenAll(streamTasks);foreach(varstreaminstreams){using(varfileStream=newFileStream("blabla",FileMode.Create)){等待流。CopyToAsync(文件流);}}}bulk是一个扩展方法,如下所示。以上就是C#学习教程:快速有效地下载多个文件共享的所有内容(异步)。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注—publicstaticIEnumerable>Batch(thisIEnumerablesource,intchunksize){while(source.Any()){yieldreturnsource.Take(块大小);source=source.Skip(块大小);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: