【发布时间】:2010-08-06 02:27:55
【问题描述】:
我有一个像这样的静态方法
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(),因为它是同一类的一部分。我认为有可能共享一些安全特性,并且不需要担心/勤奋。 (?)
我所说的显式更改(因为现在没有更好的词)是调用另一种方法来工作……它可以是静态的或实例类。我认为需要做更多的背景/研究工作来确保每个对象和方法都是线程安全的。
为了便于讨论,假设我有一个带有这个签名的方法:
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
}
}
修改后的问题
如果我创建的静态“实用程序”类要创建另一个对象的实例,然后调用方法——与直接调用静态方法相比,我会遇到并发问题(变量相互覆盖)吗?
【问题讨论】:
-
我不确定您所说的“我不确定如何处理局部变量”是什么意思。你能澄清一下吗?
-
这里我使用“newstring”作为一个范围很大的局部变量。假设该方法的 CPU 密集度很高,需要 5 秒才能完成。如果另一个请求进来,而我的方法正在运行,是否会发生数据冲突/覆盖?为了更进一步,我的方法可能会创建对象的一些新实例(非静态)并让它们做一些事情。如果碰撞没有发生在我的方法中,它会发生在子对象中吗?
-
@MakerOfThings7:我刚刚注意到您的评论,只要在静态方法中声明 newString 和其他对象,就可以了。例如,如果您必须调用其他类来获取这些对象,并且它们是在其他地方创建的,那么肯定会出现问题。
-
@MakerOfThings7:对不起,示例中没有包含太多内容,无法真正说出一种或另一种方式。您能否制作一个完整的小型示例 - 可以编译 - 并执行您正在尝试做的事情(即使它不是线程安全的),以便其他人可以基于此提出建议?
-
您的
AddNumber实现已损坏。return MyNumber在lock之外
标签: c# asp.net multithreading concurrency static