【问题标题】:Again .NET TcpClient and Threads再次 .NET TcpClient 和线程
【发布时间】:2012-10-26 20:23:06
【问题描述】:

我在 stackoverflow 上阅读了很多关于 TcpClient 和多线程的内容,但我认为我没有找到明确的答案。

我有一个包含 3 个相同线程的应用程序。 (在每个线程对象上调用相同的方法)

每个线程都创建自己的(本地)TcpClient 实例并打开到其服务器的 tcp 连接(不同的 IP 地址)。

线程应该只在不同的服务器上做同样的事情。 3 台服务器机器运行相同的服务器软件。

现在 3 个线程“同时”启动服务器请求。

TcpClient 对象是否在每个线程上完全隔离? 或者可能是底层流被不情愿地共享?

我感觉有时线程会获取不是来自“他的”服务器的数据。 例如,所有线程都在轮询“就绪”标志。 只有服务器 1 准备就绪并设置了标志,但线程 1 和线程 2 看到了设置的标志。

很有可能我做错了。 但肯定知道以这种方式在 TcpClient 对象上进行通信是安全的。

非常感谢您的任何建议, 拉尔夫

PS:是的,我目前正在阅读有关 C# 8-) 中的多线程的书籍和文档

【问题讨论】:

  • 您到底尝试了什么?我真的没有看到一个问题,我看到的是“这是真的吗?”问题,但除非您向我们提供更多信息,否则我们无法回答此类问题。除了看不懂题还有大量的语法和拼写错误,这道题需要做一些工作,需要作者自己做的工作,在附加信息贴出来的时候。
  • @all: 对不起我的英语不好

标签: c# multithreading tcpclient


【解决方案1】:

如果 TcpClient 实例是独立的,那么它们将不会共享任何状态 - 您可以根据需要使用任意数量的 TcpClient 实例。如果数据在线程之间流失,我只能假设它在您自己的代码中。在这里混淆的一个常见原因是捕获的变量(来自 lambda / anon-method 的任何东西),在 C# 5 之前,这些变量可以以不经意的审阅者可能无法预料的方式共享。没有更多信息,我们不能说更多,但不:它们不应该相互干扰。

【讨论】:

  • +1 是的 - 我看不到从一个服务器读取的标志值从另一个服务器“渗入”到另一个服务器的任何原因(假设没有愚蠢的全局/静态)。
  • Mcolli 猜测的可能是端口问题?
【解决方案2】:

服务器发回响应的端口可能有问题。 Afaik 源端口是根据向服务器发送请求的程序自动确定的。也许每个威胁之间的端口确定没有区别,因此三个同时运行的威胁在同一个端口上收到了答案......但这只是我的猜测,我不太喜欢 TCP 的东西

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多