Находится возврат урожая в ориентированном на многопотоковое исполнение C#?

Согласно спецификации HTTP, нет никакого предела длине URL. Сохраните свои URL под 2 048 символами; это гарантирует работу URL во всех клиентах & конфигурации сервера. Кроме того, поисковые системы как URL, чтобы остаться приблизительно под 2 000 символов.

26
задан Albic 4 September 2009 в 14:27
поделиться

4 ответа

Хорошо, я провел небольшое тестирование и получил интересный результат.

Похоже, что это больше проблема перечислитель базовой коллекции, чем ключевое слово yield . Перечислитель (на самом деле его метод MoveNext ) генерирует (если реализован правильно) исключение InvalidOperationException , поскольку перечисление изменилось. Согласно документации MSDN для метода MoveNext это ожидаемое поведение.

Поскольку перечисление через коллекцию обычно не является поточно-ориентированным, возврат yield return тоже не является.

]
10
ответ дан 28 November 2019 в 06:53
поделиться

Посмотрите этот пост о том, что происходит за кулисами с ключевым словом yield :

За кулисами ключевого слова yield в C #

Короче говоря, компилятор берет ваше ключевое слово yield и генерирует целый класс в IL для поддержки функциональности. Вы можете проверить страницу после перехода и проверить сгенерированный код ... и этот код выглядит так, как будто он отслеживает идентификатор потока для обеспечения безопасности.

18
ответ дан 28 November 2019 в 06:53
поделиться

Что именно вы подразумеваете под потокобезопасностью?

Вы, конечно, не должны изменять словарь во время итерации по нему, будь то в том же потоке или нет.

Если словарь является при доступе в нескольких потоках, как правило, вызывающий вызывающий должен снять блокировку (ту же самую, которая охватывает все обращения), чтобы они могли блокироваться на время итерации по результату.

РЕДАКТИРОВАТЬ: Чтобы ответить к вашему редактированию, нет в никоим образом не соответствует коду блокировки. Блок итератора не снимает автоматическую блокировку - и откуда ему знать о syncRoot ?

Более того,

20
ответ дан 28 November 2019 в 06:53
поделиться

Я думаю, что да, но не могу найти ссылку, подтверждающую это. Каждый раз, когда какой-либо поток вызывает foreach на итераторе, должен создаваться новый локальный * экземпляр потока базового IEnumerator, поэтому не должно быть никакого «разделяемого» состояния памяти, из-за которого два потока могут конфликтовать ...

  • Thread Local - В том смысле, что его ссылочная переменная привязана к кадру стека методов в этом потоке
3
ответ дан 28 November 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: