我有两个应用程序:
我希望能够通过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时,我现在正在寻找的是如何改变频率(如果有可能的话,可能是缓冲区大小)数据。 我知道通过将流“分块”成小部分是可能的,但也许有一些更好的解决方案呢?