2009-10-22 4 views
0

Быстрая версия моего вопроса:.NET Многопоточность Syncronization

единственный раз, когда вам нужно использовать «замок», когда вы обращаетесь тот же экземпляр объекта? Например, если я создаю все новое в моем методе ввода потока, мне нужно беспокоиться о блокировке любых объектов?

Детальное объяснение моего вопроса:

Мой сценарий, у меня есть объект работы с уникальным идентификатором, и эта работа объект имеет 1 метод в нем. Внутри этого метода я создаю новые экземпляры нескольких прокси-серверов веб-служб и сохраняю информацию, полученную из этих вызовов в общедоступных свойствах рабочего объекта. Когда все работы выполнены (все потоки завершены), я храню информацию в базе данных.

Любые причины для рассмотрения использования «блокировки»?

ответ

1

Вам нужно всего лишь использовать lock в одном или нескольких разделах кода, которые не должны запускаться одновременно. Например, если у вас есть код, который использует тот же самый List<T> для нескольких потоков, вам нужно будет использовать блокировку.

В вашем случае, если у вас есть отдельный рабочий объект в потоке, и если они не взаимодействуют с другими рабочими объектами или не имеют доступа к общему состоянию, вы должны быть в порядке.

Для более конкретного ответа, пожалуйста, напишите более подробную информацию или, предпочтительно, источник.


EDIT: В ответ на ваш комментарий, это зависит от реализации InvokeService. Пока он не имеет доступа к каким-либо другим статическим членам, вы, вероятно, будете работать нормально, без каких-либо блокировок.

0

Вы совершенно правы - вам не нужно блокировать объекты, к которым не доступны нити.

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

+0

Что касается потоков ввода-вывода, то ближе всего я могу прийти к тому, что мой метод ввода потоков также обращается к веб-сайтам для анализа данных. Я создаю «StreamReader», который анализирует значения из объекта HttpWebResponse. – Benny

0

Вам нужно всего лишь использовать ключевое слово блокировки, если вы обращаетесь к статическому полю или свойству из нескольких потоков.

+0

Чтобы быть явным, используйте только блокировку при доступе к статическим полям и свойствам. Это не нужно для статических методов? – Benny

+0

Это зависит от того, что делают статические методы. – SLaks

+0

Быть статичным не имеет к этому никакого отношения (хотя это очень распространенная причина «потока-враждебного кода»). Ссылки на один и тот же объект могут также встречаться в разных потоках другими способами (например, поля в runnable классе, выполняемые несколькими потоками) –

Смежные вопросы