【发布时间】:2020-11-04 12:20:13
【问题描述】:
此操作块连接到带有签名var getStream = new TransformBlock<FileChunk, Tuple<Task<HttpResponseMessage>, FileChunk>> 的转换块,但是流并未直接写入提供的文件。出于某种原因,我认为它仍然被缓存到内存中。任务是元组初始化为client.SendAsync(request, HttpCompletionOption.ResponseContentRead, CancellationToken.None);
var writeStream = new ActionBlock<Tuple<Task<HttpResponseMessage>, FileChunk>>(async task =>
{
using (var streamToRead = await task.Item1.Result.Content.ReadAsStreamAsync())
{
using (var fileToWriteTo = File.Open(task.Item2._tempfilename,
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
await task.Item1.Result.Content.CopyToAsync(fileToWriteTo).ContinueWith(task1 =>
{
var s = new FileChunk();
Interlocked.Add(ref TasksDone, 1);
asyncTasks.TryDequeue(out s);
}, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion,
TaskScheduler.Current);
}
}
}, new ExecutionDataflowBlockOptions
{
BoundedCapacity = Environment.ProcessorCount, // Cap the item count
MaxDegreeOfParallelism = Environment.ProcessorCount, // Parallelize on all cores
});
关于如何解决此问题的任何建议?另外,我假设它首先缓存到内存,因为文件大小不会在刷新时更新或增加,而是一次全部更新。
【问题讨论】:
-
任务继续是怎么回事?尤其是
out s- 这不会去任何地方。 -
你有一个名为
ConcurrentQueue<FileChunk>的asyncTasks也有点奇怪。 -
我很想看到minimal reproducible example 你在做什么?
-
@Enigmativity 它不应该去任何地方。我正在使用自定义 ConcurrentQueue 来调用 Enqueue 和 TryDequeue 上的事件。您可以在我的 github repo 上准确了解我的用途
-
理想情况下,您应该在问题中发布足够的详细信息,以便能够看到发生了什么。当我快速查看您在 repo 中的代码时,我看到的一件事是贯穿始终使用
trycatch (Exception ex) { .. }代码。这只是吞下错误的好方法。谁知道这是否是这个问题的一部分。您应该将其全部删除,只捕获您可以有意义地处理的特定异常。
标签: c# multithreading http task-parallel-library tpl-dataflow