【问题标题】:Do Tasks generated by TaskCompletionSource need to be Dispose()d?TaskCompletionSource 生成的任务是否需要 Dispose()d?
【发布时间】: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


    【解决方案1】:

    这是博客文章警告我的场景吗?

    “我需要处理这个Task吗?”的问题。只能通过任务是如何使用来回答的。特别是,请考虑博客文章中的这句话:

    分配 WaitHandle 的唯一方法是,如果您明确要求任务的 IAsyncResult.AsyncWaitHandle,这应该很少见。

    Reed's answer 在当时是正确的,但不再是继续使用AsyncWaitHandle 的情况。这些天来,没有什么会隐式使用AsyncWaitHandle,所以你应该只考虑Disposeing Tasks 如果你的消费代码将任务视为IAsyncResult em> 访问 AsyncWaitHandle 属性。即使那样,您也应该只考虑处置它们;这不是严格必要的

    请不要告诉我,只要你不能告诉我一个更好的方法,它与 async/await 模式非常兼容,并且能够将这些数据包分发给各种选定的侦听器,请不要告诉我。

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

    另外,如果您经常希望您的 Wait() 方法已经有可用的数据包,那么请考虑使用 ValueTask&lt;T&gt;

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 2019-06-18
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多