收集被修改;无法在socket.Receive上执行操作列表

时间:2011-09-08 05:31:21

标签: .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 ->
        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 

2 个答案:

答案 0 :(得分:3)

只是想得出结论,如果有人在未来阅读或得到一个类似的问题:

问题是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 -> ...

答案 1 :(得分:1)

遍历时(foreach)无法修改枚举。您正在使用的外部代码是什么?

使用byte[]接收数据,有关示例,请参阅here