如何在c#中停止powershell调用器

本文关键字:powershell 调用 | 更新日期: 2023-09-27 18:18:53

我用c#调用powershell命令,powershell命令是后台调用的。我想终止后台线程。每次我终止后台线程时,powershell仍在运行,这导致我无法再次运行该线程。有什么方法可以终止powershell的执行吗?

设置后台线程如下:

Task.run(()=>{ while(...) {...                             
if (cancellationToken.IsCancellationRequested)
{
    cancellationToken.ThrowIfCancellationRequested();
}}}); 
Task.run(()=>{ 
    while(...) { powershell.invoke(powershellCommand);// it will execute here, I don't know how to stop. 
} })

如何在c#中停止powershell调用器

我知道我迟到了,但我刚刚写了一个扩展方法,它将对BeginInvoke()EndInvoke()的调用粘贴到任务并行库(TPL)中:

public static Task<PSDataCollection<PSObject>> InvokeAsync(this PowerShell ps, CancellationToken cancel)
{
    return Task.Factory.StartNew(() =>
    {
        // Do the invocation
        var invocation = ps.BeginInvoke();
        WaitHandle.WaitAny(new[] { invocation.AsyncWaitHandle, cancel.WaitHandle });
        if (cancel.IsCancellationRequested)
        {
            ps.Stop();
        }
        cancel.ThrowIfCancellationRequested();
        return ps.EndInvoke(invocation);
    }, cancel);
}

停止PowerShell脚本非常简单,这要归功于PowerShell类中的Stop()方法。

如果您想异步调用脚本,可以很容易地使用CancellationToken:

using(cancellationToken.Register(() => powershell.Stop())
{
    await Task.Run(() => powershell.Invoke(powershellCommand), cancellationToken);
}

使用Task.Factory.FromAsync:

await Task.Factory.FromAsync(shell.BeginInvoke(), shell.EndInvoke)
    .WaitAsync(cancellationToken)
    .ConfigureAwait(false);

这允许在代码的其他地方注册取消令牌,以便在需要时取消执行时添加额外的副作用。