Я обнаружил 'ThreadStaticAttribute', и у меня есть много вопросов об этом: весь мой зависимый предыдущего сообщения статическая информация, были реализованы как статический словарь, какой TKey является Потоком, и когда я хотел получить доступ к нему, я использовал Поток. CurrentThread и это работают. Но это требует mantainance, потому что, если поток умирает, я должен удалить соответствующую запись из словаря. И я также должен рассмотреть потокобезопасность и много других вопросов.
При помощи ThreadStaticAttribute все эти вопросы, кажется, решены, но я должен быть уверен в нем. Мои вопросы: я должен удалить экземпляр, содержат отмеченными полями 'ThreadStaticAttribute', так или иначе, прежде чем поток умрет?? Где информация того поля, содержат?? Это находится в экземпляре объекта Потока или чего-то как этот, так, чтобы, когда это больше не используется, сборщик "мусора" автоматически отбросил его? Есть ли потери производительности? Какие? Это быстрее, чем использование Включенного набора как, я делал?
Мне нужно разъяснение по поводу того, как работают 'ThreadStaticAttribute'.
Спасибо.
Нет, вам не нужно удалять экземпляры значений, справкой в поле, помеченном ThreadStatic
. Сборщик мусора автоматически заберет их, когда нить, так и объект больше не достигаются укоренившимися объектами.
Единственным исключением здесь является, если ценное значение IDSPosable
, и вы хотите активно распоряжаться этим. В целом это сложная проблема для решения по ряду причин. Это намного проще, чтобы не иметь ценностей, которые реализуются IDSposable
и находятся в в поле
.
Как к тому, где это поле на самом деле сохраняется, он несколько не имеет значения. Все, что вам нужно беспокоить, это то, что он будет вести себя как любой другой объект в .NET. Единственными двумя различиями поведения являются
Простое описание SDK показывает, что ответ заключается в том, что это не имеет значения - они одинаковы . Оба они превращаются в __ T (x)
.
C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _T(" *.h crt\src\tchar.h:2439:#define _T(x) __T(x) include\tchar.h:2390:#define _T(x) __T(x) C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _TEXT(" *.h crt\src\tchar.h:2440:#define _TEXT(x) __T(x) include\tchar.h:2391:#define _TEXT(x) __T(x)
И для полноты:
C:\...\Visual Studio 8\VC>findstr /spin /c:"#define __T(" *.h crt\src\tchar.h:210:#define __T(x) L ## x crt\src\tchar.h:889:#define __T(x) x include\tchar.h:210:#define __T(x) L ## x include\tchar.h:858:#define __T(x) x
Однако, технически , для C++ следует использовать TEXT ()
вместо _ TEXT ()
, но он (в конечном итоге) расширяется и на то же самое.
Неправильный синтаксис JSON. Нельзя иметь один и тот же ключ дважды в объекте. Вместо этого вам нужен массив:
var homes = {
"Agents" : [
{ "name" : "Bob Barker" },
{ "name" : "Mona Mayflower" }
],
...
}
Тогда вы можете получить доступ к агентам так:
homes.Agents[1] // => { "name": "Mona Mayflower" }
// or
homes.Agents[1].name // => "Mona Mayflower"
-121--3796805- Пометка статической переменной-члена как [ThreadStatic] говорит компилятору выделить ее в области памяти потока (например, где выделен стек потока), а не в глобальной области памяти. Таким образом, каждый поток будет иметь собственную копию (которая гарантированно будет инициализирована до значения по умолчанию для этого типа, например. null, 0, false и т.д.; не используйте внутристрочные инициализаторы, поскольку они инициализируют его только для одного потока).
Таким образом, когда поток уходит, его область памяти также освобождает ссылку. Конечно, если это то, что нуждается в более немедленном удалении (открытые потоки файлов и т.д.) вместо ожидания фоновой сборки мусора, вы можете убедиться, что вы сделаете это до выхода потока.
Объем доступного пространства [ThreadStatic] может быть ограничен, но этого должно быть достаточно для разумного использования. Он должен быть несколько быстрее, чем доступ к коллекции с ключом (и более легко защищен от потоков), и я думаю, что он сравним с доступом к обычной статической переменной.
Исправление: С тех пор я слышал, что доступ к переменным ThreadStatic несколько медленнее, чем к обычным статическим переменным. Я не уверен, что это даже на самом деле быстрее, чем доступ к шпоночной коллекции, но это позволяет избежать проблем сирот (что было вашим вопросом) и необходимости блокировки для безопасности резьбы, что усложнит подход к шпоночной коллекции.