我目前正在使用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);
...
}
我最好将run方法调用为异步,但我似乎没有办法用输入和输出流(仅使用脚本文件名和args)。
我错过了什么或者这不可能吗?
答案 0 :(得分:1)
没有" RunAsync"由于outputStream
,这组参数的方法:在这种情况下,包装器重定向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
内执行。可以添加使用ReadStdOutToStream
的{{1}}的异步版本,但当前包装器具有net40目标,并且此方法不可用。也许是时候使用net45,在这种情况下可以添加Stream.ReadAsync
用于流,如果确实需要的话。