NReco phantomjs使用输入和输出流运行脚本异步

时间:2018-01-12 15:15:08

标签: c# phantomjs nreco

我目前正在使用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)。

我错过了什么或者这不可能吗?

1 个答案:

答案 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用于流,如果确实需要的话。