来自Process的输出流未通过WCF返回

时间:2016-08-23 13:05:37

标签: c# wpf wcf

我有两个应用程序:

  1. 作为客户的WPF
  2. 独立于WCF服务的控制台应用程序
  3. 我希望能够通过WCF启动进程并从该进程返回输出流(因此我将使用process.StandardOutput.BaseStream)。

    问题是,一旦进程启动,在进程退出之前不会返回作为输出流的返回对象。

    我的两个以编程方式创建的绑定中的TransferMode设置为Streamed。

    上传文件 TO WCF工作正常,但问题仅存在于返回流中。

    WCF服务代码:

    [OperationContract]
        Stream RunTests(string testPackageDll);
    

    实现:

    public Stream RunTests(string testPackageDll)
        {
            var p = new Process()
            {
                StartInfo =
                {
                    FileName = @"C:\Tests\NUnit-2.6.4\nunit-console.exe",
                    Arguments = $@"C:\Tests\{testPackageDll} /xml=test-results.xml",
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    CreateNoWindow = true
                }
            };
    
            try
            {
                p.Start();
                p.BeginOutputReadLine();
                return p.StandardOutput.BaseStream;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }
    

    WPF应用程序代码:

    public void RunTests(string testToRun)
        {            
    
            string streamLine;
    
            using (TextReader reader = new StreamReader(_serviceHandler.Service.RunTests(testToRun)))
            {
                streamLine = reader.ReadLine();
                while (streamLine != null)
                {
                    WriteToConsole(streamLine);
                    streamLine = reader.ReadLine();
                }
            }
        }
    

    _serviceHandler.Service.RunTests(testToRun)方法不会像预期的那样返回Stream,而是等待进程结束然后返回流。

    我想要实现的是直接从流程中读取“live”流。

    更新

    我刚刚发现Stream实际上是通过WCF流​​式传输的,但只有当输出文本缓冲区达到12-16 kb时,我现在正在寻找的是如何改变频率(如果有可能的话,可能是缓冲区大小)数据。 我知道通过将流“分块”成小部分是可能的,但也许有一些更好的解决方案呢?

0 个答案:

没有答案