C#处理 - 完成前暂停或休眠

时间:2010-10-07 08:55:28

标签: c# multithreading process ftp

我有一个过程:

Process pr = new Process();
pr.StartInfo.FileName = @"wput.exe";
pr.StartInfo.Arguments = @"C:\Downloads\ ftp://user:dvm@172.29.200.158/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上传客户端。

当我运行该过程并开始上传时,应用程序冻结,控制台输出直到结束才会显示。我猜第一个问题可以通过使用Thread来解决。

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

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

2 个答案:

答案 0 :(得分:4)

您可以使用OutputDataReceived事件异步打印输出。这有一些要求:

  

在StandardOutput上的异步读取操作期间启用该事件。要启动异步读取操作,必须重定向Process的StandardOutput流,将事件处理程序添加到OutputDataReceived事件,并调用BeginOutputReadLine。此后,每次进程将一行写入重定向的StandardOutput流时,OutputDataReceived事件都会发出信号,直到进程退出或调用CancelOutputRead。

这项工作的一个例子如下。它只是做一个长时间运行的操作,也有一些输出(findstr /lipsn foo *在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);
        }
    }
}

答案 1 :(得分:1)

最好的方法是使用支持FTP的库,而不是依赖外部应用程序。如果您不需要外部应用程序提供太多信息且未验证其输出,那么请继续。否则最好使用FTP客户端库。

可能你想看libs / documentations:

http://msdn.microsoft.com/en-us/library/ms229711.aspx

http://www.codeproject.com/KB/IP/ftplib.aspx

http://www.c-sharpcorner.com/uploadfile/danglass/ftpclient12062005053849am/ftpclient.aspx