我目前正在使用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()方法一直向下但它没有任何区别。
使整个渲染器异步的最佳方法是什么?