我在我的软件中使用
根据这个问题Do I need to dispose of a Task?和这篇博客Parallel Programming with .NET的说法,
这是我等待新数据包的方法。这个方法将使用
我正在使用.NET Core >= 2.2。该博客文章指出,
问题:在这种特定情况下,我需要释放
请勿告诉我,只要您不能告诉我一种非常兼容
TaskCompletionSource
来分发网络数据包给async
/await
方法。因此,在我的代码中,有许多点需要等待从接收处理程序中分离出并传递给方法async Wait()
的网络数据包。每秒可能会有很多、很多个数据包,我要决定是将数据包推送到TaskCompletionSource
还是放入Queue
中。所以,每当没有TaskCompletionSource
时,我都会创建一个新的,这会导致一个新的Task
对象。根据这个问题Do I need to dispose of a Task?和这篇博客Parallel Programming with .NET的说法,
Task
不需要被Dispose
。然而,我有时会每秒实例化几千个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中发生了变化。问题:在这种特定情况下,我需要释放
Task
吗?如果在此代码路径上传递许多数据包时不释放由TaskCompletionSource
创建的任务,那么我会创建许多句柄吗?这是博客文章警告我的场景吗?请勿告诉我,只要您不能告诉我一种非常兼容
async
/await
模式并能够将这些数据包分配给各个选定侦听器的更好方法,就认为此方法是一个糟糕的选择。也请不要告诉我,由于许多网络数据包而创建许多对象通常是一个坏主意。