进程冲突 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);
}
考虑以下几点:
- 写
auditPath
cmd
-命令开始使用它 - 您无需等待它完成。
- 由于不等待完成,循环进入下一次迭代
并且在
cmd
-command 已经在使用时写入了一个新的 auditPath
"previous" 一个。
或者
- 在
cmd
-命令实际开始之前(但在 Process.Start()
已经完成),循环进入下一次迭代并打开一个新的 "version"
auditPath
,写信给它。
cmd
-命令终于开始访问文件,您看到了错误。
总而言之,这里存在竞争条件。请务必等待 Process
完成,
例如
using (var proc = Process.Start(...))
{
proc.WaitForExit();
// You might want to check `proc.ExitCode`, etc.
}
在 运行 下一个循环周期之前。
要点:Process.Start() 不是同步的。如果您需要等待启动的命令完成,您需要明确地执行它,否则它会在后台继续 运行 并且可能会干扰您的其他逻辑 - 正如它目前所做的那样。
我有以下代码:
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);
}
考虑以下几点:
- 写
auditPath
cmd
-命令开始使用它 - 您无需等待它完成。- 由于不等待完成,循环进入下一次迭代
并且在
cmd
-command 已经在使用时写入了一个新的auditPath
"previous" 一个。
或者
- 在
cmd
-命令实际开始之前(但在Process.Start()
已经完成),循环进入下一次迭代并打开一个新的 "version"auditPath
,写信给它。 cmd
-命令终于开始访问文件,您看到了错误。
总而言之,这里存在竞争条件。请务必等待 Process
完成,
例如
using (var proc = Process.Start(...))
{
proc.WaitForExit();
// You might want to check `proc.ExitCode`, etc.
}
在 运行 下一个循环周期之前。
要点:Process.Start() 不是同步的。如果您需要等待启动的命令完成,您需要明确地执行它,否则它会在后台继续 运行 并且可能会干扰您的其他逻辑 - 正如它目前所做的那样。