C# 远程Powershell代码块并行执行

C# 远程Powershell代码块并行执行,c#,multithreading,powershell,powershell-remoting,C#,Multithreading,Powershell,Powershell Remoting,有人能帮助理解远程powershell中的多线程吗? 我正在尝试仅使用WinRM将文件复制到远程计算机。以下是算法: 将本地文件划分为字节[]块 每个区块都是base64编码的 base64字符串在powershell代码块中发送到远程WinRM,该代码块对其进行解码并附加到文件 远程文件最终填充了所有字节,是本地文件的精确副本 问题是,在执行远程powershell块时,我遇到了“该进程无法访问该文件,因为它被另一个进程使用”类型的错误。看起来powershell并行执行我的脚本块。但我需要顺

有人能帮助理解远程powershell中的多线程吗? 我正在尝试仅使用WinRM将文件复制到远程计算机。以下是算法:

  • 将本地文件划分为字节[]块
  • 每个区块都是base64编码的
  • base64字符串在powershell代码块中发送到远程WinRM,该代码块对其进行解码并附加到文件
  • 远程文件最终填充了所有字节,是本地文件的精确副本
  • 问题是,在执行远程powershell块时,我遇到了“该进程无法访问该文件,因为它被另一个进程使用”类型的错误。看起来powershell并行执行我的脚本块。但我需要顺序执行。我可以覆盖这个吗


    完整的代码示例可用。

    每次创建远程PowerShell会话时,它都使用不同的PowerShell进程来执行请求。这就是您遇到文件争用问题的原因。您应该考虑为每个操作使用相同的远程会话,而不是每次添加一个块时创建一个新的会话。


    顺便说一句,如果您在(或当您到达)V5上,您可以使用
    $s=New PSSession remoteComputerName;复制项目src.txt C:\dst.txt-ToSession$s
    将文件复制到远程计算机。

    谢谢Keith。关于V5:我希望至少能够在V3上运行此代码。“您应该考虑为每个操作使用相同的远程会话,而不是每次想添加一个块时创建一个新的会话。”——您能建议如何这样做吗?移动PosikSead。传递您创建的PowerShell对象。事实上,您可以通过调用打开文件并在init方法中创建
    $fs
    变量的代码来加快执行速度。当您向appendContent提供相同的PowerShell会话时,仍将定义
    $fs
    。您可以执行一行
    $fs.Write(…)
    。然后在写入所有字节后,使用另一种方法关闭文件。谢谢Keith。我已经用你的建议重构了代码。在这个版本中,进程重叠也会发生,但很少发生,而且仅限于大型文件(>37MB,我将它们分开)。因此,可以捕获并重试。示例可用。