gpt4 book ai didi

.net - TaskCompletionSource 生成的 Task 需要 Dispose()d 吗?

转载 作者:行者123 更新时间:2023-12-04 13:19:51 24 4
gpt4 key购买 nike

我正在使用 TaskCompletionSource在我的软件中将网络数据包分发到 async/await方法。因此,在我的代码中,软件需要等待网络数据包从接收处理程序中解复用并移交给方法 async Wait() 的各个点。 .每秒可能有很多很多数据包,我正在决定是否要将数据包推送到 TaskCompletionSource或放入 Queue .所以,只要没有 TaskCompletionSource我将创建一个新的,它会导致一个新的 Task目的。

根据这个问题Do I need to dispose of a Task?并根据此博客 Parallel Programming with .NET Task s 不需要是 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在这个特定场景中?我会创造很多Handles , 如果我不这样做 DisposeTaskCompletionSource 创建的任务当收到沿此代码路径的许多数据包时?这是博客条目警告我的场景吗?

请不要告诉我,这种方法是一个糟糕的选择,只要你不能告诉我一种与 async 非常兼容的更好的方法。/ await模式,还能够将这些数据包分发给各种选定的监听器。也请不要告诉我,因为许多网络数据包而创建许多对象通常是一个坏主意。

最佳答案

Is this the scenario the blog entry warned me about?



“我需要处理这个 Task 吗?”的问题只能通过任务的消耗方式来回答。特别是,请考虑博客文章中的引用:

the only way the WaitHandle will be allocated is if you explicitly ask for the Task’s IAsyncResult.AsyncWaitHandle, and that should be quite rare.



Reed's answer当时确实如此,但延续使用 AsyncWaitHandle 的情况已不再如此。 .这些天,什么都不会用 AsyncWaitHandle隐含地,所以你应该只考虑 Dispose ing Task s 如果您的消费代码将任务视为 IAsyncResult并访问 AsyncWaitHandle属性(property)。即便如此,你也应该只考虑处理它们;这不是绝对必要的。

Please refrain from telling me, that this method is a bad choice as long as you can't tell me a better method being very compatible to async/await pattern and also being able to distribute those packets to various selected listeners.



我建议将异步兼容的生产者/消费者队列构建为单独的类型;我认为这将有助于您的代码更清晰。您可以 use BufferBlock<T> , async queue type from my AsyncEx library ,或使用异步兼容监视器构建您自己的监视器。

另外,如果您经常期待您的 Wait()方法已经有可用的数据包,然后考虑使用 ValueTask<T> .

关于.net - TaskCompletionSource 生成的 Task 需要 Dispose()d 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54755889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com