在运行空间中执行PS命令的代码是否需要锁定?

时间:2016-05-06 10:09:43

标签: c# powershell thread-safety runspace

Java家伙正试图通过深入研究一些现有的C#代码来学习一些C#,用PowerShell检查用户凭据。

我想要了解的下面的代码是在可能的性能问题的背景下。

以下方法CheckCredentials()经常被调用,并且似乎长时间停留,持续60秒甚至更长时间。我的第一个嫌疑人当然是lock()部分。我不明白为什么需要锁定,如果是的话。

根据文档,InitialSessionState.CreateDefault()RunspaceFactory.CreateRunspace()是线程安全的,因为它们是公共静态方法(相关部分herehere

方法中使用的所有对象都是重新创建的;唯一的共享变量是_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;
    }
}

0 个答案:

没有答案