进程冲突 C#

Process confliction C#

我有以下代码:

while (condition == true)
{
    //First part
    using (var stream = File.Create(audioPath))
    {
        using (WaveFileWriter writer = new WaveFileWriter(stream, waveFormat))
        {
            writer.Write(audioBytes.ToArray(), 0, audioBytes.ToArray().Length);
        }
    }
    //Second part
    using (Process.Start("cmd.exe", commands)) { };
    Thread.Sleep(1000);
}

第一部分将字节数组保存到音频文件,然后我的代码的第二部分 运行 是一个 .cmd 文件,该文件对代码进行一些处理。但是,上面的代码 returns 错误

the process cannot access the file (audioPath) because it is being used by another process.

我已经阅读了一些其他答案并且之前遇到过这个问题,但总是设法用 using 语句解决它。

两个部分运行正确独立(当另一部分被注释掉时)。如果有任何影响,我将在 Windows Server 2016 上 运行 宁此。我也为 folder/file 添加了权限,因为它们都是独立工作的,我怀疑这是权限问题。

有没有可能是using语句没有正确配置?

我不知道这是否有帮助,但您可以尝试摆脱一个 using 并使用 WaveFileWriter 的其他构造函数:

using (WaveFileWriter writer = new WaveFileWriter(fileName, waveFormat))
{
  writer.WriteData(testSequence, 0, testSequence.Length);
}

您是否真的通过 相同的 名称生成文件? audioPath好像没变。

while (condition == true)
{
    //First part
    using (var stream = File.Create(audioPath))
    {
        using (WaveFileWriter writer = new WaveFileWriter(stream, waveFormat))
        {
            writer.Write(audioBytes.ToArray(), 0, audioBytes.ToArray().Length);
        }
    }
    //Second part
    using (Process.Start("cmd.exe", commands)) { };
    Thread.Sleep(1000);
}

考虑以下几点:

  1. auditPath
  2. cmd-命令开始使用它 - 您无需等待它完成。
  3. 由于不等待完成,循环进入下一次迭代 并且在 cmd-command 已经在使用时写入了一个新的 auditPath "previous" 一个。

或者

  1. cmd-命令实际开始之前(但在 Process.Start() 已经完成),循环进入下一次迭代并打开一个新的 "version" auditPath,写信给它。
  2. cmd-命令终于开始访问文件,您看到了错误。

总而言之,这里存在竞争条件。请务必等待 Process 完成, 例如

using (var proc = Process.Start(...)) 
{
   proc.WaitForExit();
   // You might want to check `proc.ExitCode`, etc.
}

在 运行 下一个循环周期之前。

要点:Process.Start() 不是同步的。如果您需要等待启动的命令完成,您需要明确地执行它,否则它会在后台继续 运行 并且可能会干扰您的其他逻辑 - 正如它目前所做的那样。