Ari*_*ian 1 c# asp.net concurrency thread-safety c#-6.0
请考虑这段代码:
public class BusinessClass
{
static BusinessClass myClass { get; set; }
Repository repo;
public BusinessClass()
{
if (repo == null)
repo = new RepositoryClass();
}
public static BusinessClass Instance
{
get
{
if (myClass == null)
myClass = new BusinessClass();
return myClass ;
}
}
public void Update(Entity Item)
{
repo.Update(Item);
}
}
Run Code Online (Sandbox Code Playgroud)
我想BL在我的网页中使用它,如下所示:
BusinessClass.Instance.Update(Item);
Run Code Online (Sandbox Code Playgroud)
我的问题是:这段代码对于线程安全有问题吗?方法上两个人可以同时走到一起吗Update?
谢谢
如果您使用asp.net表单和asp.net会话,那么会话将锁定所有用户的整个调用,因此您不需要额外注意同步它。
相关问题:
ASP.NET Web 窗体是否阻止双击提交?
尝试使 Web 方法异步
Web 应用程序在处理共享同一会话的另一个 Web 应用程序时被
阻止 哪些性能计数器可用于识别 ASP.NET 瓶颈?
完全替换 ASP.Net 的会话
如果您不使用asp.net会话,或者如果您在同一个调用上打开额外的线程,那么您需要锁定静态数据的操作。
public class BusinessClass
{
private static readonly object oLock = new object();
static BusinessClass myClass { get; set; } = null;
Repository repo;
public BusinessClass()
{
if (repo == null)
repo = new RepositoryClass();
}
public static BusinessClass Instance
{
get
{
if myClass == null)
{
lock (oLock)
{
if myClass == null)
myClass = new BusinessClass();
}
}
return myClass
}
}
public void Update(Entity Item)
{
repo.Update(Item);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您希望仔细检查数据库或文件上的全局更改,或者任何可以通过系统模拟编辑更改的内容 - 在网络花园(同一站点的多个池)上运行的网络平台上......并忽略会话...
然后你需要互斥锁来同步所有调用。
通过使用mutex,您还需要在更新之前检查记录是否仍然相同,如果不是,则发出信号表明其他人更改了它,当前用户将覆盖它。
想想这个场景。
用户A和B加载相同的页面、相同的数据,并且每个人都改变它们。
用户将保存每个数据——不是同一时刻——而是有很多不同的时间。您写下的数据是最后保存的数据。其中一位用户将丢失他们的更改。
因此,如果您的用户更新相同的数据(超出锁定系统),您需要更多考虑并在多用户环境中发出更多同步信号。