Fre*_*ood 4 .net c# multithreading async-await
我有这么多文件,我必须下载.所以我尝试使用新的异步功能,如下所示.
var streamTasks = urls.Select(async url => (await WebRequest.CreateHttp(url).GetResponseAsync()).GetResponseStream()).ToList();
var streams = await Task.WhenAll(streamTasks);
foreach (var stream in streams)
{
using (var fileStream = new FileStream("blabla", FileMode.Create))
{
await stream.CopyToAsync(fileStream);
}
}
Run Code Online (Sandbox Code Playgroud)
我担心这段代码会导致大量内存使用,因为如果有1000个文件包含2MB文件,那么这段代码会将1000*2MB流加载到内存中?
我可能会遗漏一些东西,或者我完全正确.如果我没有错过任何东西,那么最好等待每个请求和消费流是最好的方法吗?
这两种选择都可能存在问题.一次只下载一个不会扩展并且需要花费时间,而一次下载所有文件可能会造成太大的负担(同样,在处理它们之前无需等待所有文件下载).
我更喜欢用可配置的大小限制这种操作.一个简单的方法是使用AsyncLock(利用SemaphoreSlim).一种更健壮的方式是使用TPL Dataflowa MaxDegreeOfParallelism.
var block = new ActionBlock<string>(url =>
{
var stream = (await WebRequest.CreateHttp(url).GetResponseAsync()).GetResponseStream();
using (var fileStream = new FileStream("blabla", FileMode.Create))
{
await stream.CopyToAsync(fileStream);
}
},
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 100 });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1111 次 |
| 最近记录: |