一个 Java 人正试图通过深入研究一些现有的 C# 代码来学习一些 C#,使用 PowerShell 检查用户凭据。
我试图理解的下面的代码是在可能的性能问题的背景下。
下面的方法 ,CheckCredentials()
经常被调用,并且似乎被卡住了很长一段时间,60 秒甚至更长时间。当然,我的第一个嫌疑人是lock()
角色。我不明白为什么需要锁,如果是的话。
根据文档,InitialSessionState.CreateDefault()
并且RunspaceFactory.CreateRunspace()
是线程安全的,因为它们是公共静态方法(此处和此处的相关部分)
方法中使用的所有对象都是重新创建的;唯一的共享变量是_lock
(我不确定它为什么会存在)和modulePath
. 所以,本质上,只有modulePath
可以被多个线程访问。但是,这似乎不是问题。它只是一个路径,代码正在导入一个 PS 模块。
我的问题是:下面的代码是否需要“锁定”?
private readonly object _lock = new object();
private readonly string modulePath;
public async Task<bool> CheckCredentials(string username, string password)
{
try
{
// Create Initial Session State for runspace.
var initialSession = InitialSessionState.CreateDefault();
initialSession.ImportPSModule(new[] { modulePath });
// Create credential object.
var credential = GetPowerShellCredential(username, password);
// Create command to connect office 365.
var connectCommand = new Command("Connect-MsolService");
connectCommand.Parameters.Add((new CommandParameter("Credential", credential)));
lock(_lock)
{
using (var psRunSpace = RunspaceFactory.CreateRunspace(initialSession))
{
psRunSpace.Open();
psRunSpace.Invoke(connectCommand);
}
return true;
};
}
catch (Exception e)
{
log.Info("Failed to check credentials.", e);
return false;
}
}