进程冲突C#

时间:2018-12-20 07:01:32

标签: c# process dispose using naudio

我有以下代码:

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文件,该文件对代码进行了一些处理。但是,以上代码返回错误

  

该进程无法访问文件(audioPath),因为它正在被另一个进程使用。

我已经阅读了其他一些答案,并且之前曾遇到过此问题,但始终可以通过using语句来解决。

两个部分独立地正确运行(当另一部分被注释掉时)。如果有任何影响,我将在Windows Server 2016上运行它。我还向文件夹/文件添加了权限,并且由于它们都独立工作,因此我怀疑这是权限问题。

using语句是否可能没有正确处理?

2 个答案:

答案 0 :(得分:2)

您真的使用相同名称生成文件吗? 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. 由于您不等待它完成,因此循环进入下一个迭代 并且在auditPath命令已经在使用时写入了新的cmd “上一个”。

或者

  1. 实际上cmd命令开始之前(但Process.Start()命令已经开始之后) 已经完成),则循环进入下一个迭代并打开一个新的“版本” auditPath,并对其进行写入。
  2. cmd命令最终开始访问该文件,您会看到可见的错误。

总的来说,您在这里有比赛条件。确保您等待Process完成, 例如

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

在运行下一个循环之前。

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

答案 1 :(得分:0)

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

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