今天写代码的时候需要将socket作为参数传递给task.factory.startnew的处理函数,但是发现在开启的线程内无法使用传递进来的socket,想问一下是socket无法作为参数传递还是我的传参方式有问题?
传参的代码如下:
task.Factory.starnew(()=>func(socket))
因为关了电脑所以用手机只打了一行
socket只是一个int型的套接字ID,可以作为参数传递的,是否在其他线程中close了该socket。还有一点,初始化socket一般在主进程初始化阶段完成,或者在父线程完成。
task.Factory.starnew(p=>func((socket)p),socket) //请带参传递,避免闭包内直接使用,产生穿越代码
至于其他问题,上面那位已经说。因为共用对象,使用时候请主要使用try去处理,因为socket的状态是内部维持,他的状态不是“死”值,所以自己需要使用安全代码防范意外
谢谢两位大佬的解答,我找到问题所在了,我的部分源代码如下:
Task.Factory.StartNew(() => recv(clients[i]));
我原本的考虑是通过socket数组来存储多个客户端的连接,再通过循环控制每个accept的socket进入新线程进行处理,问题出在这个传递参数的i上,使用如上代码中的形式会导致参数无法传递进新线程中。改为如下形式即可:
Socket para = clients[i]
Task.Factory.StartNew(() => recv(para));
附上一个相同问题的链接http://www.skcircle.com/?id=1812