0

私はdistでファイルを開いて作成し、このproceesにサブスクライブするプロセスを持っています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 このブロックを配置する必要がある場所に soを使用してプロセスが停止するようにしたい

4

4 に答える 4

0

私の意見では、これを使用すると、イベントを発生させるのではなく、問題を解決できる可能性があります。何かが私に起こり、私はそれを使用して解決しWaitForExit()ます。

var process = Process.Start(...);
process.WaitForExit();

// Delete your file.
于 2013-10-15T15:42:09.913 に答える
0

これを試して、これで問題が解決するかどうか教えてください:

    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
        });
    }
于 2013-10-15T15:42:18.700 に答える
0

ファイルをコピーして削除するのではなく、ファイルを移動します。ファイルをコピーしてからオリジナルを削除する必要がある理由はありますか? 代わりにファイルを移動してみませんか? 同じ物理ハード ドライブに移動する場合、通常、移動する方がコピーして削除するよりもはるかにコストがかかりません。そうでない場合でも、少なくともファイル操作を節約できます。

于 2013-10-15T15:41:12.017 に答える