gpt4 book ai didi

c# - 这段代码是线程安全的吗?我怎样才能使它线程安全?

转载 作者:太空狗 更新时间:2023-10-29 20:57:56 25 4
gpt4 key购买 nike

我有一个带有安全类的 WCF 服务,用于获取调用用户的一些属性。然而,在线程安全方面我很糟糕 - 到目前为止,我不需要做太多的事情,对多线程问题只有一个基本的理论理解。

给定以下函数:

public class SecurityService
{
public static Guid GetCurrentUserID()
{
if (Thread.CurrentPrincipal is MyCustomPrincipal)
{
MyCustomIdentity identity = null;
MyCustomPrincipal principal = (MyCustomPrincipal)Thread.CurrentPrincipal;
if (principal != null)
{
identity = (MyCustomIdentity)principal.Identity;
}

if (identity != null)
{
return identity.UUID;
}
}
return Guid.Empty;
}
}

如果从 2 个不同的线程同时调用该方法,是否有可能出现问题?在我的噩梦中,如果这些方法出错,我会看到可怕的后果,比如某人不小心获取了别人的数据或突然成为系统管理员。一位同事(他也不是专家,但他比我强)认为这可能没问题,因为那里实际上没有任何共享资源可以访问。

或者这一个,它将访问数据库 - 这会出错吗?

    public static User GetCurrentUser()
{
var uuid = GetCurrentUserID();
if (uuid != null)
{
var rUser = new UserRepository();
return rUser.GetByID(uuid);
}
return null;
}

有很多关于线程原理的讨论,但在实际应用它以及知道何时应用它时,我往往会陷入困境并感到困惑。任何帮助表示赞赏。

如果不清楚,我可以解释更多关于这些功能的上下文/目的。

编辑: rUser.GetByID() 函数基本上调用了一个存储库,该存储库使用 NHibernate 查找数据库。所以我猜这里的数据库是一个“共享资源”,但实际上并不是为这个操作而被锁定或修改的数据库……在这种情况下我想没关系……?

最佳答案

据我所知,第一个示例仅访问线程本地存储和基于堆栈的变量,而第二个示例仅访问基于堆栈的变量。

两者都应该是线程安全的。

我无法判断 GetByID 是否线程安全。查看它是否访问任何共享/静态资源。如果是这样,如果没有一些额外的代码来保护这些资源,它就不是线程安全的。

关于c# - 这段代码是线程安全的吗?我怎样才能使它线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1258501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com