【问题标题】:What happens with TCPClient after its NetworkStream is passed out of scope? is it disposed?TCPClient 在其 NetworkStream 超出范围后会发生什么?它被处置了吗?
【发布时间】:2021-01-22 02:03:28
【问题描述】:

我想知道当我第一次在函数范围内创建 TCPClient,从中提取 NetworkStream,将其传递给类的 c-tor 并返回新创建的对象时会发生什么:

{
    TcpClient client = new TcpClient();
    await client.ConnectAsync(host, outport).ConfigureAwait(false);
    NetworkStream stream = client.GetStream();
    TCPWrapperAdapterWithStream adapter = new TCPWrapperAdapterWithStream(stream, stream, 100);
    return adapter;
}

离开上下文后客户端会发生什么?流仍然可以工作吗? 我可以这样做还是必须“保留”TCPClient 对象?

【问题讨论】:

  • 您在调试程序时遇到问题了吗?
  • 令人惊讶的是没有。但怎么可能呢?
  • 嗯.. 这有点超出我的知识和专业知识,但它实际上归结为NetworkStream 类型实例上的 GC 跟踪行为,它是通过应用程序(或其他功能范围)引用\使用)。我认为如果适配器被持久化,TCPClient 会在这里持久化,因为回收它似乎有问题 - 但我不确定。

标签: c# tcpclient networkstream


【解决方案1】:

如果你继续使用它,TCPClient 就会开始抛出。当我发现 SSLStream 在 Dispose 中无故抛出时,我最终提交了一个错误,因为它调用了 TCPClient.Flush(),它在 NetworkStream 死亡时抛出。

(我需要立即关闭 SSLStream,因为我知道它已经死了,如果以正常方式关闭它会在失败前阻塞几秒钟,所以我尝试了这个。)

另一方面,TCPClient 将尝试在终结器中释放其 NetworkStream。我很久以前就被这个咬过。

【讨论】:

  • 但我不再使用 TCPClient,只使用它的 NetworkStream。
  • @MichaelW:那么终结者讨厌你的胆量。
猜你喜欢
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多