如果实际上不需要结果,那么TaskCompletionSource使用什么泛型类型参数

时间:2016-10-29 18:29:07

标签: c# .net task-parallel-library

如果我们要创建一个没有ssh -Y $yourserver的基于observer:start().的{​​{1}},我们仍然需要提供TaskCompletionSource<T>并设置虚拟值。像这样:

Task

从性能角度来看,Result的最佳类型是什么?

似乎很难仅仅通过运行微观基准来回答这个问题。我想答案取决于应用程序的其余部分。例如,如果我们使用T将导致JIT生成专门的代码并导致内存使用。但如果应用程序已经使用基于布尔的任务,它将不会添加内存使用量。如果我们使用Task SomethingAsync() { var tcs = new TaskCompletionSource<?>(); tcs.SetResult(default(?)); //Can happen later as well, this is for demo purposes. return tcs.Task; } ,我们可能会为每个任务使用更多内存(或者不依赖于运行时)。

这就是为什么我认为只有基准测试不能回答这个问题,而且必须通过推理来回答。

1 个答案:

答案 0 :(得分:3)

如果您真的想要最好的解决方案,则需要声明一个空结构。这样,系统将不必为​​有效载荷保留任何空间。这实际上是在基类库中完成的:

https://referencesource.microsoft.com/#System.Core/System/Threading/Tasks/TaskExtensions.cs,6e36a68760fb02e6,references

window.location.reload(false); 
// If we needed to pull the document from
//  the web-server again (such as where the document contents
//  change dynamically) we would pass the argument as 'true'.

从那里,您可以使用private struct VoidResult { } TaskCompletionSource<VoidResult>将任务标记为已完成。

也就是说,它节省了一点点内存,但我认为它对执行时间没有任何影响(即使在纳秒级别)。无论您使用TrySetResult(default(VoidResult))(为有效负载保留一个字节)还是TaskCompletionSource<byte>(为有效负载保留四个字节),32位CPU仍然可以在一次操作中完成分配。