Коллекция была изменена; невозможно выполнить операции листинга на сокете. Получить - PullRequest
0 голосов
/ 08 сентября 2011

Когда я делаю:

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 ]

3 голосов
/ 08 сентября 2011

просто хотел бы заключить, если кто-то прочитает это или получит похожий вопрос в будущем:

Проблема была в коллекции Core.listPos и ​​Seq.iter в

Core.listPos |> Seq.iter /> fun op ->
   ...

не сокет. Получите, потому что listPos был изменен из другого потока.Seq.iter будет (так же, как foreach в C #) генерировать такие исключения, если коллекция изменяется (чаще всего это происходит из-за некоторого .Remove внутри тела цикла).

Простым решением было бы написать

let positions = Core.listPos |> Seq.toArray
positions |> Seq.iter /> fun op -> ...
1 голос
/ 08 сентября 2011

Вы не можете изменять перечисление при его обходе (foreach).Какой внешний код вы используете?

Используйте byte[] для получения данных, см. здесь для примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...