我想出了一段代码,将多个调用Task.WhenAll()
链接在一起。我认为这样可以实现目的,但看起来有点奇怪。它的目的是在关闭服务之前允许所有Tasks
完成。伪代码省略了一些循环、方法声明等...
//initialize once on startup
Task _completion = Task.FromResult(0);
//Every minute a timer fires and we start some tasks
// and then chain them into the existing Task
var newTasks = Enumerable.Range(0, 10).Select(_ => Task.Factory.StartNew(() => {/* long running stuff here */})).ToArray();
_completion = Task.WhenAll(_completion, Task.WhenAll(newTasks));
//At some point a shutdown will be requested, and we can just wait for the one Task to complete
_completion.Wait();
这是一个不好的主意吗?我会一直持有对每个任务的引用,导致它们永远无法被垃圾回收,或者导致某些内部数组变得庞大,或者发生其他可怕的事情吗?
对我来说,反复从
Task.WhenAll()
获取结果并将其反馈到Task.WhenAll()
感觉有点奇怪。我查看了Task.WhenAll()的源代码,我没有看到任何表明这可能是个问题的地方。但我肯定不是这个主题的专家。
Task.WaitAll(tasks)
在这里更适合你。它会阻塞当前的执行,直到所有给定的任务都完成。 - abatishchev