我TaskCompletionSource
在我的软件中使用将网络数据包分发到async
/await
方法。所以在我的代码中,软件需要等待网络数据包从接收处理程序中解复用并移交给方法的各个点async Wait()
。每秒可能有很多很多数据包,我正在决定是否要将数据包推TaskCompletionSource
送到Queue
. 所以,只要没有,TaskCompletionSource
我就会创建一个新的,这会导致一个新的Task
对象。
根据这个问题Do I need to dispose of a Task? 并且根据此博客.NET Task
的并行编程不需要Dispose
d。但是,我有时TaskCompletionSource
每秒实例化数千个。链接博客中的详细答案还说,Task
可能在内部使用WaitHandle
. 现在我有一种强烈的感觉,即我的情况正是如此,我应该Dispose
在TaskCompletionSource
.
这就是我等待新数据包的方式。此方法将被调用,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 中的行为也发生了变化。
Task
问题:在这种特定情况下我需要 Dispose吗?我会创建很多Handles
吗,如果我没有在接收到沿此代码路径的许多数据包时Dispose
创建的任务?TaskCompletionSource
这是博客条目警告我的场景吗?
请不要告诉我,只要您不能告诉我更好的方法与async
/await
模式非常兼容并且能够将这些数据包分发给各种选定的侦听器,请不要告诉我这种方法是一个糟糕的选择。也请不要告诉我,由于许多网络数据包而创建许多对象通常是一个坏主意。