Не уверен, упоминался ли этот вопрос, но атрибут ThreadStatic действительно полезен. Это делает статическое поле статическим только для текущего потока.
[ThreadStatic]
private static int _ThreadStaticInteger;
Вы не должны включать инициализатор, потому что он выполняется только один раз для всего приложения, лучше сделать поле обнуляемым и проверить, является ли значение нулевым, прежде чем использовать его.
И еще одна вещь для потоков приложений ASP.NET используется повторно, так что если вы измените значение, оно может в конечном итоге использоваться для другого запроса страницы.
Тем не менее я нашел это полезным в нескольких случаях. Например, при создании пользовательского класса транзакции, который:
using (DbTransaction tran = new DbTransaction())
{
DoQuery("...");
DoQuery("...");
}
Конструктор DbTransaction устанавливает поле ThreadStatic на свое собственное значение и сбрасывает его на ноль в методе dispose. DoQuery проверяет статическое поле и, если! = Null, использует текущую транзакцию, если нет, то по умолчанию используется что-то другое. Мы избегаем необходимости передавать транзакцию каждому методу, и это облегчает перенос других методов, которые изначально не предназначались для использования с транзакцией внутри транзакции ...
Только одно использование:)
Я бы сначала начал с поиска переменной окружения JAVA_HOME (и, возможно, JDK_HOME, хотя это гораздо реже), а затем определил, какая это версия и JDK или JRE.
После которые проверяют общие места вместо. Найдите каталог системных программных файлов (не просто предполагайте, что это C: \ Program Files, даже если это 99,5% времени) и найдите в нем общие места установки (например, Java).
Я бы не стал этого делать. исчерпывающий поиск.
Стоит спросить: действительно ли вам нужно таким образом находить JDK? Разве вы не можете просто спросить пользователя, какой JDK он хочет использовать, возможно, предложив какие-нибудь простые, которые вы уже нашли?
System.out.println(System.getProperty("java.version"));
Другие свойства здесь
Я бы, вероятно, выбрал комбинацию поиска установленных ключей реестра Java и сканирования мест по умолчанию для установки (что не должно занять слишком много времени).
Альтернативный подход заключался бы в объединении крошечного Java-приложения, которое печатает различные детали, такие как запущенная JVM.