异步PDF文档渲染器

时间:2014-10-07 08:12:43

标签: c# asynchronous windows-store-apps async-await

我目前正在使用windows 8.1 native pdf渲染器实现异步文档渲染器。我的目标是,让这个渲染器渲染每个pdf页面asyncrounasly,但应该可以更改渲染方向或覆盖当前渲染位置(这些更改由用户交互触发)。背景是,在Windows应用商店应用中将此渲染器用于我自己的文档寻呼机。用户应该能够跳转到第XX页,而不是等待它按顺序呈现,而是立即跳转到它。

背景非常多。

到目前为止,我实现的渲染器确实可以正常工作,但我注意到它并非真正异步。 我的DocumentRenderer类有一个PagRender,它为一个单独的页面执行实现呈现。呈现页面的方法调用是异步的,但其余的不是我的DocumentRenderer的另一部分需要更长时间我的UI线程被阻止。例如,如果我用User输入覆盖渲染位置,我的渲染器有时会忽略XX页面,因为他已经渲染了它们。对于巨大的PDF文件来说,这主要是一个问题(我使用了带有1300页的PDF参考,其中渲染器有时不得不忽略数百页)。

Importend要提到的是,我定义了两个事件:一个用于ImageRendered,一个用于RenderingFinished。要使用渲染器,我必须订阅theese事件并在UI中处理渲染的图像(DocumentPager)。

这里是我的render()方法的代码:

public async void Render()
{
    var rendered = ImageRendered;
    if (rendered == null)
    {
        return;
    }

    while (!AllPagesRendered())
    {
               Debug.WriteLine(Tag + "---------------------> Direction: Forward");
            while (RenderPosition < mPageRenderer.getPageCount())
            {                      
                if (IsPageRendered(RenderPosition))
                {                          
                    Debug.WriteLine(Tag + "Page " + RenderPosition + " was ignored... already rendered ");
                    RenderPosition++;
                    continue;
                }                       
                Uri ImageURL = await mPageRenderer.RenderPage(RenderPosition);
                string t = ImageURL.ToString();
                ImageItem image = new ImageItem(new Uri("ms-appx:/" + ImageURL.AbsolutePath), RenderPosition);
                    Debug.WriteLine(Tag + "Render Image at position " + RenderPosition);
                RenderedImages.Add(image);
                rendered(this, new RenderArgs(image));                  
                RenderPosition++;

                if (RestartRendering)
                {
                         Debug.WriteLine(Tag + "---------------------> Restart Renderer... at position " + NewPosition);
                    RenderPosition = NewPosition;
                    RestartRendering = false;
                }

                if (ChangeDirection)
                {
                        Debug.WriteLine(Tag + "---------------------> Change Direction. Restarting renderer...");
                    ChangeDirection = false;
                    break;
                }
            }

            if (!EscapeLoop)
            {
                if (!AllPagesRendered())
                {
                       Debug.WriteLine(Tag + "Rendering not finished... RenderPosition back to 0 ");
                    RenderPosition = 0;
                }
            }
            else
            {
                EscapeLoop = false;
            }
    }
      Debug.WriteLine(Tag + "---------------> Rendering finished");
    EventHandler handler = RenderingFinished;
    handler(this, new EventArgs());
}

此渲染器高度依赖于UI上下文,因此像Render()。ConfigureAwait(false);不是一种选择。我也知道异步void方法不是一个好的样式,但我已经等待这个render()方法一直向下但它没有任何区别。

使整个渲染器异步的最佳方法是什么?

0 个答案:

没有答案