我很好奇这是否允许语法,以及它到底是做什么的
public void startThreads(string userIp){
user1 = new TCPListener("0.0.0.0", 1111);
tmpThread = new Thread(new ThreadStart(() => User1Listern(user1);
tmpThread.Start();
user2 = new TCPListener("0.0.0.0", 1112);
tmpThread = new Thread(new ThreadStart(() => User2Listern(user2);
tmpThread.Start();
user3 = new TCPListener("0.0.0.0", 1113);
tmpThread = new Thread(new ThreadStart(() => User3Listern(user3);
tmpThread.Start();
}
public void User3Listern(TCPListener tmp){
tcpLister = (TCPListener)tmp;
user3.Start(); //Start User3
Thread.Sleep(1000);
//MS documenation
while(true){
user3 = this.tcpListener.AccepTcpClient();
Thread User3Start = new Thread(new ParamertizedThreadStart(User3Profile));
User3Start.Start(user3);
}
}
我的问题:
答案 0 :(得分:2)
一个线程可以包含多个这样的线程吗?
这不是正在发生的事情。这些线程不会以任何方式“连接”。每次都创建和启动一个。
执行此操作时:
tmpThread = new Thread(new ThreadStart(() => User2Listern(user2);
新线程与上一个线程无关。此处发生的事情甚至与线程实际上没有任何关系,对于任何对象也是如此。
正在创建一个新对象,并且变量现在指向该新对象,而不是旧对象。旧的仍然存在。如果没有任何东西在使用旧对象,那么它可能可以在后台进行垃圾收集。但是这里不是这种情况,旧对象仍在内存中,并且仍作为线程执行其工作。 变量现在仅指向一个新对象。
如果在此方法结束时检查tmpThread
的内容,则会发现它仅引用最后创建的Thread
对象。该方法不再引用前两个对象。
答案 1 :(得分:1)
让我从您跳过的几个基本概念开始:
Parallel
API完成,该API内部使用{{1 }} 什么是线程?
现在您的代码及其用途了吗?
我的问题是一个线程可以包含多个这样的线程吗? (tmpThread)?
Threadpool
方法时执行了后台线程,当由主线程召集然后控制权返回到主线程时,而后台线程在后台完成其任务。如果您不“加入”这些内容,而只是“启动”它们会发生什么。
start
指示主线程在退出之前等待背景线程完成,如果未调用join,则主线程可能退出,如果没有什么可处理的,则该过程将完成然后后台线程就像僵尸一样,无法通过它们获得结果。尽管大多数情况下都是这样,如果后台线程正在执行一些内存中的作业,但让我们假设它进行了一次数据库调用,那么这将会成功,但是如果没有预期的结果不会返回,因为没有线程可以接收它们更多信息
编辑1
回顾fiddle上的TCP服务器实现,我使用了以下link中的引用。
该实现包含什么:
Join