Java家伙正试图通过深入研究一些现有的C#代码来学习一些C#,用PowerShell检查用户凭据。
我想要了解的下面的代码是在可能的性能问题的背景下。
以下方法CheckCredentials()
经常被调用,并且似乎长时间停留,持续60秒甚至更长时间。我的第一个嫌疑人当然是lock()
部分。我不明白为什么需要锁定,如果是的话。
根据文档,InitialSessionState.CreateDefault()
和RunspaceFactory.CreateRunspace()
是线程安全的,因为它们是公共静态方法(相关部分here和here)
方法中使用的所有对象都是重新创建的;唯一的共享变量是_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;
}
}