打开进程时放置使用块的位置
本文关键字:位置 进程 | 更新日期: 2023-09-27 18:35:22
我有进程,我正在 dist 上打开并创建文件并订阅此过程ProcessExitedEvent
:
public int InvokeProcess(WiresharkProcesses process, string args)
{
try
{
string processToInvoke = null;
ProcessStartInfo startInfo = new ProcessStartInfo();
Process pros = new Process();
startInfo .FileName = processToInvoke;
startInfo .RedirectStandardOutput = true;
startInfo .RedirectStandardError = true;
startInfo .RedirectStandardInput = true;
startInfo .UseShellExecute = false;
startInfo .CreateNoWindow = true;
startInfo .Arguments = args;
pros.StartInfo = startInfo ;
pros.ErrorDataReceived += pros_ErrorDataReceived;
pros.OutputDataReceived += pros_OutputDataReceived;
pros.Exited += (object sender, EventArgs e) =>
{
if (ProcessExitedEvent != null)
ProcessExitedEvent(pros.Id);
};
pros.EnableRaisingEvents = true;
pros.Start();
pros.BeginOutputReadLine();
pros.BeginErrorReadLine();
return pros.Id;
}
catch (Exception)
{
return -1;
}
}
private void ProcessExitedEvent(int processId)
{
// Copy file
// Delete file
}
这个过程在磁盘上创建文件,在触发事件后ProcessExitedEvent
我想将此文件复制到另一个位置,而不是删除旧文件,但是尽管在进程退出后触发的事件,但我的代码无法删除旧文件,因为该文件仍在使用中,所以我想确保我的进程通过使用using block
那么我需要把这个块放在哪里?
我非常怀疑using
语句在这里会有所帮助。 Process.Dispose
不会终止其他进程 - 它只是将 CLR 句柄释放到另一个进程。(老实说,我不记得每次看到有人使用using
语句来表示Process
- 与大多数一次性资源不同,我不会担心这个。
我很惊讶您无法删除该文件,但可能是操作系统只是在进程死亡时刷新缓冲区或其他东西。您可能需要尝试在删除文件之前等待一秒钟...虽然这不应该真的是必要的。您确定不是像病毒检查器之类的东西在拾取文件吗?
我会移动文件而不是复制和删除它。是否有原因需要复制文件然后删除原始文件?为什么不移动文件?如果它被移动到同一个物理硬盘驱动器,通常移动它比复制和删除它的成本要低得多,如果不是,你仍然可以至少节省文件操作。
在我看来,使用这可能是它解决您的问题而不是触发事件。我发生了一些事情,我通过使用WaitForExit()
来解决它。
var process = Process.Start(...);
process.WaitForExit();
// Delete your file.
试试这个,告诉我这是否解决了问题:
public void InvokeProcess(WiresharkProcesses process, string args)
{
Task.Factory.StartNew(() =>
{
string processToInvoke = null;
ProcessStartInfo startInfo = new ProcessStartInfo();
using (Process pros = new Process())
{
startInfo.FileName = processToInvoke;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
startInfo.Arguments = args;
pros.StartInfo = startInfo;
//pros.EnableRaisingEvents = true;
pros.Start();
pros.WaitForExit();
}
// Copy file
// Delete file
});
}