【发布时间】:2019-02-18 21:49:43
【问题描述】:
我在我的软件中使用TaskCompletionSource 将网络数据包分发给async/await 方法。因此,在我的代码中,软件需要等待从接收处理程序中解复用的网络数据包并移交给方法async Wait() 的各个点。每秒可能有很多很多数据包,我正在决定是否要将数据包推送到TaskCompletionSource 或将其放入Queue。所以,只要没有TaskCompletionSource,我就会创建一个新的,这会导致一个新的Task 对象。
根据这个问题Do I need to dispose of a Task? 和这个博客Parallel Programming with .NET Tasks 不需要是Disposed。但是,我有时每秒会实例化数千个TaskCompletionSource。链接博客中的详细答案还说,Task 可以在内部使用WaitHandle。现在我有一种强烈的感觉,我的情况就是这样,我应该在TaskCompletionSource 的任务上使用Dispose。
这就是我等待新数据包的方式。此方法将使用await 调用,也可以大量并行调用:
public async Task<Packet> Wait()
{
Packet packet;
lock (sync)
if (packets.TryDequeue(out packet))
return packet;
else
waiter = new TaskCompletionSource<Packet>();
return await waiter.Task;
}
我从网络处理程序推送数据包的方法如下所示:
public void Poke(Packet packet)
{
lock (sync)
if (waiter == null)
packets.Enqueue(packet);
else
waiter.SetResult(packet);
}
我使用的是 .NET Core >= 2.2。该博客条目指出WaitHandle 的行为在 .NET 4.5 中也发生了变化。
问题:在这种特定情况下我需要 Dispose Tasks 吗?我会创建许多Handles,如果我不DisposeTaskCompletionSource 创建的任务,当接收到许多来自此代码路径的数据包时?这是博客文章警告我的场景吗?
请不要告诉我,只要您不能告诉我更好的方法,该方法与 async/await 模式非常兼容并且还能够分发这些方法,请不要告诉我数据包到各种选定的侦听器。也请不要告诉我,因为很多网络数据包而创建很多对象通常是个坏主意。
【问题讨论】:
标签: .net task dispose taskcompletionsource