0

我目前正在使用 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 方法 async 但我似乎没有办法使用输入和输出流(仅使用脚本文件名和 args)来执行此操作。

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

4

1 回答 1

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使用的异步版本Stream.ReadAsync,但当前包装器具有 net40 目标,并且此方法不可用。也许是时候改用 net45 了,在这种情况下RunAsync,如果确实需要,可以添加流。

于 2018-01-23T13:37:56.537 回答