1

一个 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;
    }
}
4

0 回答 0