У меня есть статический метод, подобный этому
public static string DoSomethingToString(string UntrustedString)
{
//parse format and change string here.
return newString.
}
Поскольку я знаю, что множественные вызовы:
static int myInt=0;
public static int AddNumber()
{
lock(someObject)
{
myInt++;
return myInt;
}
}
будут возвращать постоянно увеличивающееся число (которое распределяется между страницами),Я не уверен, как локальные переменные будут обрабатываться в DoSomethingToString ();
Я хотел бы узнать условия, в которых статический метод может безопасно / небезопасно использоваться в ASP.net просто для того, чтобы поместить мойМногопоточный мозг, чтобы отдохнуть на эту тему.
ОБНОВЛЕНИЕ:
Большая часть обсуждения была вокруг типов значений.Как узнать, когда безопасно вызывать методы (явные или неявные), которые меняют мои ссылочные типы?Достаточно ли просматривать документацию MSDN и использовать только те методы, в которых указано «threadSafe»?
Один из примеров того, что я называю неявным изменением, - это использование String.Split (), поскольку он является частью того же класса.Я думаю, что есть вероятность того, что некоторые характеристики безопасности являются общими и что требуется меньше беспокойства / усердия.(?)
То, что я называю явным изменением (из-за отсутствия лучшего слова прямо сейчас), - это вызов другого метода для выполнения работы ... который может быть статическим или классом экземпляра.Я думаю, что необходимо провести дополнительную справочную / исследовательскую работу, чтобы гарантировать, что каждый объект и метод являются ThreadSafe.
Ради обсуждения предположим, что у меня есть метод с такой подписью:
ValidateStringAndContext(string untrustedString, Object myCustomUserContext)
и у него есть статический метод, который ссылается на следующий объект
public SecurityChecker
{
public static object CheckSecurityStatic(string DirtyData)
{
//do string.split
//maybe call a database, see if it's a token replay
//
//OR - alternate implementation
SecurityChecker sc = new SecurityChecker();
if (sc.CheckSecurity(DirtyData))
{
myCustomUserContext.Property1 = new GUID()
}
return myCustomUserContext;
}
public class bool CheckSecurity(string DirtyData)
{
//do string.split
//maybe call a database, see if it's a token replay
// return true if OK return false if not
}
}
Пересмотренный вопрос
Буду ли я сталкиваться с проблемами параллелизма (переменные перезаписывают друг друга), если статическийСоздаваемый мной класс «утилит» должен был создать экземпляр другого объекта и затем вызвать метод --versus--, просто вызвав статический метод напрямую?