NReco phantomjs 运行 脚本与输入和输出流异步
NReco phantomjs run script async with input and output streams
我目前正在使用 NReco phantomjs 包装器,一切正常。我调用现有的 JavaScript 文件并使用流传递数据和输出流来获取结果,然后我可以将结果转换为 PNG 并将其插入到文档中。
代码看起来有点像:
using (var inputStream = new MemoryStream(Encoding.UTF8.GetBytes(serialisedJsonData + "\n")))
using (var outputStream = new MemoryStream())
{
var phantomJS = new PhantomJS();
phantomJS.Run("javascriptfile.js", null, inputStream, outputStream);
...
}
理想情况下,我想调用异步的 运行 方法,但我似乎没有办法对输入和输出流执行此操作(仅使用脚本文件名和参数)。
我是不是遗漏了什么或者这不可能?
由于 outputStream
,这组参数没有 "RunAsync" 方法:在这种情况下,包装器重定向 phantomjs 的标准输出,并将输出复制到指定的 Stream
。这是由以下代码执行的:
private void ReadStdOutToStream(Process proc, Stream outputStream) {
var buf = new byte[32 * 1024];
int read;
while ((read = proc.StandardOutput.BaseStream.Read(buf, 0, buf.Length))>0) {
outputStream.Write(buf, 0, read);
}
}
并且这个方法是在Run
里面执行的。可以添加使用 Stream.ReadAsync
的 ReadStdOutToStream
的异步版本,但当前包装器具有 net40 目标并且此方法不可用。也许是时候改用 net45 了,在这种情况下,如果确实需要,可以为流添加 RunAsync
。
我目前正在使用 NReco phantomjs 包装器,一切正常。我调用现有的 JavaScript 文件并使用流传递数据和输出流来获取结果,然后我可以将结果转换为 PNG 并将其插入到文档中。
代码看起来有点像:
using (var inputStream = new MemoryStream(Encoding.UTF8.GetBytes(serialisedJsonData + "\n")))
using (var outputStream = new MemoryStream())
{
var phantomJS = new PhantomJS();
phantomJS.Run("javascriptfile.js", null, inputStream, outputStream);
...
}
理想情况下,我想调用异步的 运行 方法,但我似乎没有办法对输入和输出流执行此操作(仅使用脚本文件名和参数)。
我是不是遗漏了什么或者这不可能?
由于 outputStream
,这组参数没有 "RunAsync" 方法:在这种情况下,包装器重定向 phantomjs 的标准输出,并将输出复制到指定的 Stream
。这是由以下代码执行的:
private void ReadStdOutToStream(Process proc, Stream outputStream) {
var buf = new byte[32 * 1024];
int read;
while ((read = proc.StandardOutput.BaseStream.Read(buf, 0, buf.Length))>0) {
outputStream.Write(buf, 0, read);
}
}
并且这个方法是在Run
里面执行的。可以添加使用 Stream.ReadAsync
的 ReadStdOutToStream
的异步版本,但当前包装器具有 net40 目标并且此方法不可用。也许是时候改用 net45 了,在这种情况下,如果确实需要,可以为流添加 RunAsync
。