Есть ли встроенная функциональность в .NET для создания переменных, связанных с потоками? - PullRequest
2 голосов
/ 20 декабря 2010

Есть ли способ сделать это (код psedo):

GetCurrentThread().Items.Add(new RefObject);

, а затем извлечь его

RefObject[] refObjs = GetCurrentThread().Items;

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

Основная идея заключается в том, что я могу легко идентифицировать элементы для текущего потока и они фактически созданы в этом потоке.Это то же самое, что использование объекта Page.Request для запроса ASP.NET - вы знаете, что он очень уникален в рабочем процессе, поэтому он не смешивается с другими запросами, которые обрабатываются одновременно.Я хочу обработать поток как Page.Request - он приходит и уходит, но пока он жив, я могу запросить его по желанию, не заботясь о других угрозах, которые существуют в процессе.

Однажды я сделал нечто похожее, но это было скорее симуляция путем маршалинга объектов по ссылке.И я могу придумать еще пару способов сделать это, но я действительно не хочу вручную сохранять отображение между потоком и объектом.Разве нет ничего похожего на TransactionScope для потоков в .NET ?Я не слишком заинтересован в том, чтобы справляться с трудностями синхронизации и избегать условий гонки.

PS: Если это недоступно, могу ли я сделать это хотя бы для домена приложения без статических переменных

Ответы [ 2 ]

5 голосов
/ 20 декабря 2010

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

3 голосов
/ 20 декабря 2010

В дополнение к [ThreadStatic] (уже упоминалось), в .NET 4.0 есть ThreadLocal<T> - что в целом похоже, но предназначено только для чтения для потокахранилище, использующее инициализацию на основе делегатов.

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

Преимущество ThreadLocal<T> заключается в том, что его не нужно привязывать к статическому полю - его можно использовать (например) в середине лямбда-тела.Но если вам это не нужно, [ThreadStatic] проще.

...