在 for 循环中创建的线程不起作用 [重复]

Posted

技术标签:

【中文标题】在 for 循环中创建的线程不起作用 [重复]【英文标题】:Threads created in for loop does not work [duplicate] 【发布时间】:2021-03-05 10:44:34 【问题描述】:

所以我目前正在使用套接字,我想打开 3 个端口供客户端套接字连接。因此,如果我手动添加我的线程,这将有效。

Thread t = new Thread(() => SyncServer.StartListening(new IPAddress(new byte[]127,0,0,1), port));
t.Start();
Thread t2 = new Thread(() => SyncServer.StartListening(new IPAddress(new byte[]127,0,0,1), port + 1));
t2.Start();
....

但我想让它更简洁一些,所以我尝试使用 for 循环

List<Thread> threads = new List<Threads>();
for(int i = 0; i<3;i++)

    Thread t = new Thread(() => SyncServer.StartListening(new IPAddress(new byte[]127,0,0,1), port + i));
    t.Start();
    threads.Add(t);

套接字服务器确实可以正常工作,但是当我使用线程并手动添加它们时。如果我使用 for 循环,带有端口的套接字服务器将不可用。可能是因为线程停止了,我不明白为什么。

注意:SyncServer 是一个静态类,而 StartListening 是一个静态方法。如果我使用 for 循环,它们总是得到最新的端口号(在本例中为 11003)。

【问题讨论】:

相关:Captured variable in a loop in C# 【参考方案1】:

我猜这与经典的“for 循环中的 lambda 函数”问题有关。

List<Thread> threads = new List<Threads>();
for(int i = 0; i<3;i++)

    // Copying the `i` value to another variable will help
    var innerI = i;
    Thread t = new Thread(() => SyncServer.StartListening(new IPAddress(new byte[]127,0,0,1), port + innerI));
    t.Start();
    threads.Add(t);

【讨论】:

什么鬼,这确实可以。非常感谢你,我以前从未见过。我猜想在套接字完全设置之前 i 值会被覆盖。并且每次都会在一个新的内存位置创建 innerI。

以上是关于在 for 循环中创建的线程不起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java中的for循环不起作用[重复]

循环向量不起作用::向量下标超出范围[重复]

ggplot 如果它在 for 循环内则不起作用,尽管它在它之外工作 [重复]

减少计数值以重复循环循环不起作用。 python中的for循环有一个异常处理程序,它有一个continue语句

带字符串的 For 循环不起作用

实时matplotlib图在循环中不起作用[重复]