C# 进程 - 完成前暂停或 sleep

标签 c# multithreading process ftp

我有一个流程:

Process pr = new Process();
pr.StartInfo.FileName = @"wput.exe";
pr.StartInfo.Arguments = @"C:\Downloads\ ftp://user:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="bfdbc9d2ff8e888d918d86918d8f8f918e8a87" rel="noreferrer noopener nofollow">[email protected]</a>/Transfer/Updates/";
pr.StartInfo.RedirectStandardOutput = true;
pr.StartInfo.UseShellExecute = false;
pr.StartInfo.
pr.Start();

string output = pr.StandardOutput.ReadToEnd();

Console.WriteLine("Output:");
Console.WriteLine(output);

Wput是一个ftp上传客户端。

当我运行该进程并开始上传时,应用程序卡住并且控制台输出直到最后才会显示。我想第一个问题可以通过使用线程来解决。

我想要做的是开始上传,让它经常暂停,读取已生成的任何输出(使用此数据做进度条等),然后重新开始。

我应该研究哪些类/方法?

最佳答案

您可以使用OutputDataReceived异步打印输出的事件。要实现此功能有一些要求:

The event is enabled during asynchronous read operations on StandardOutput. To start asynchronous read operations, you must redirect the StandardOutput stream of a Process, add your event handler to the OutputDataReceived event, and call BeginOutputReadLine. Thereafter, the OutputDataReceived event signals each time the process writes a line to the redirected StandardOutput stream, until the process exits or calls CancelOutputRead.

下面是此工作的一个示例。它只是执行一个长时间运行的操作,也有一些输出(findstr/lipsn foo * on C:\- 在 C 驱动器上的任何文件中查找“foo”)。 StartBeginOutputReadLine 调用是非阻塞的,因此您可以在 FTP 应用程序的控制台输出滚动时执行其他操作。

如果您想停止从控制台读取内容,请使用 CancelOutputRead/CancelErrorRead方法。另外,在下面的示例中,我使用单个事件处理程序处理标准输出和错误输出,但如果需要,您可以将它们分开并以不同的方式处理它们。

using System;
using System.Diagnostics;

namespace AsyncConsoleRead
{
    class Program
    {
        static void Main(string[] args)
        {
            Process p = new Process();
            p.StartInfo.FileName = "findstr.exe";
            p.StartInfo.Arguments = "/lipsn foo *";
            p.StartInfo.WorkingDirectory = "C:\\";
            p.StartInfo.UseShellExecute = false;

            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.OutputDataReceived += new DataReceivedEventHandler(OnDataReceived);
            p.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceived);

            p.Start();

            p.BeginOutputReadLine();

            p.WaitForExit();
        }

        static void OnDataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine(e.Data);
        }
    }
}

关于C# 进程 - 完成前暂停或 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3880091/

相关文章:

c# - 支持多线程的异步任务队列

android - 永远等待 Handler.postDelayed 执行

C# 如何使用 Interop 重命名 Excel 工作表

c# - 寻找绝对数的最大值

c# - 什么是组播端口号?

c++ - 如何(最好)将 WM_QUIT 发布到正在运行的进程?

powershell - 在 PowerShell 中使用 Plink 创建进程并向其发送命令

c# - 如何获取事件中的工作流实例?

java - CompletableFuture 的执行顺序

linux - 在ubuntu中检查进程的启动时间后,有没有办法在一定时间后杀死进程?