Java の専門家が、既存の C# コードに飛び込んで、PowerShell でユーザー資格情報をチェックすることで、C# を学ぼうとしています。
私が理解しようとしている以下のコードは、パフォーマンスの問題の可能性があるコンテキストにあります。
以下のメソッドCheckCredentials()
は、かなり頻繁に呼び出され、60 秒以上の長時間スタックしているようです。もちろん、私の最初の容疑者はそのlock()
部分です。ロックが必要な場合、なぜロックが必要なのか理解できません。
ドキュメントによると、InitialSessionState.CreateDefault()
public RunspaceFactory.CreateRunspace()
static メソッドであるため、スレッドセーフです(関連セクション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;
}
}