我有以下代码:
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
语句是否可能没有正确处理?
答案 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);
}
请考虑以下内容:
auditPath
被写入。cmd
命令开始使用它-您无需等待它完成。auditPath
命令已经在使用时写入了新的cmd
“上一个”。或者
cmd
命令开始之前(但Process.Start()
命令已经开始之后)
已经完成),则循环进入下一个迭代并打开一个新的“版本”
auditPath
,并对其进行写入。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);
}