Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 收集被修改;无法在套接字上执行操作。接收_.net_Sockets_F# - Fatal编程技术网

.net 收集被修改;无法在套接字上执行操作。接收

.net 收集被修改;无法在套接字上执行操作。接收,.net,sockets,f#,.net,Sockets,F#,当我在做: Array.Clear(Core.arrayRead,0 , 1024) let cBytes = Core.socket.Receive(Core.arrayRead, 1024, SocketFlags.None) 第一次(使用空数组)它工作得很好,但下一次当我清除数组以接收新字节时,我遇到了以下错误:集合被修改;无法执行操作列表 天还在晴吗?还是怎样我怎样才能修好它 更多代码: try Core.listPos |> Seq.iter /> fun op

当我在做:

Array.Clear(Core.arrayRead,0 , 1024)
let cBytes = Core.socket.Receive(Core.arrayRead, 1024, SocketFlags.None)
第一次(使用空数组)它工作得很好,但下一次当我清除数组以接收新字节时,我遇到了以下错误:集合被修改;无法执行操作列表

天还在晴吗?还是怎样我怎样才能修好它

更多代码:

try
    Core.listPos |> Seq.iter /> fun op ->
        Core.socket.Send(op.Buffer) |> ignore
        Array.Clear(Core.arrayRead,0 , 1024)
        let cBytes = Core.socket.Receive(Core.arrayRead, 1024, SocketFlags.None) // error ->
        if  cBytes > 0 then
            Core.WorkPos cBytes
with
    | :? SocketException as e   -> Core.output.Add ("Ошибка протокола связи : "    + e.Message)
    | _ as e                    -> Core.output.Add ("Ошибка : "                    + e.Message) // My error here 

在遍历枚举(foreach)时不能修改它。您使用的外部代码是什么


使用
字节[]
接收数据,请参见示例。

遍历枚举时不能修改它(foreach)。您使用的外部代码是什么


使用
字节[]
接收数据,请参见示例。

只是想总结一下,如果有人读到这篇文章或将来遇到类似问题:

问题在于中的Core.listPos集合和Seq.iter

Core.listPos |> Seq.iter /> fun op ->
   ...
不是socket.Receive,因为listPos已从另一个线程更改。 如果集合发生更改,Seq.iter将(就像C#中的foreach一样)抛出此类异常(这通常是由于循环体中的一些
。Remove

一个简单的解决办法是写

let positions = Core.listPos |> Seq.toArray
positions |> Seq.iter /> fun op -> ...

我只是想总结一下,如果有人读到了这篇文章,或者将来会遇到类似的问题:

问题在于中的Core.listPos集合和Seq.iter

Core.listPos |> Seq.iter /> fun op ->
   ...
不是socket.Receive,因为listPos已从另一个线程更改。 如果集合发生更改,Seq.iter将(就像C#中的foreach一样)抛出此类异常(这通常是由于循环体中的一些
。Remove

一个简单的解决办法是写

let positions = Core.listPos |> Seq.toArray
positions |> Seq.iter /> fun op -> ...

嗨,我不认为这个错误来自这两行代码-你能检查异常的stacktrace并给出上面提到的行吗?是的,我也发现这很奇怪。但是错误正好出现在接收字符串上。设置arrayRead是否会改变Core.listPos?这是我能从中得到的唯一感觉(因为Seq.iter是的,这是我的错。Core.listPos被另一个threadHi更改了,我不认为这个错误来自这两行代码-你能检查异常的stacktrace并给出上面提到的行吗?是的,我也发现这很奇怪。但是错误正好出现在接收字符串上。设置arrayRead是否有点奇怪更改Core.listPos?这是我能从中得到的唯一感觉(因为Seq.iter是的,这是我的错。Core.listPos被另一个线程更改了。哦,这真的是我的错。我错过了Core.listPos在单独的线程中更改了。哦,这真的是我的错。我错过了Core.listPos在单独的线程中更改了。