我在做的时候:
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
答案 0 :(得分:3)
只是想得出结论,如果有人在未来阅读或得到一个类似的问题:
问题是Core.listPos集合和
中的Seq.iterCore.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。