C# 异步PDF文档渲染器
我目前正在使用windows 8.1本机pdf渲染器实现一个异步文档渲染器。我的目标是,让此渲染器异步渲染每个pdf页面,但应该可以更改渲染方向或覆盖当前渲染位置(这些更改由用户交互触发)。背景是,在Windows应用商店应用程序中将此渲染器用于我自己的文档寻呼机。用户应该能够跳转到XX页,而无需等待它按顺序呈现,而是立即跳转到它 背景就到此为止 到目前为止,我实现的渲染器确实工作得很好,但我注意到,它并不是真正的异步。 我的DocumentRenderer类有一个PagRender,它对一个单独的页面进行实际渲染。呈现页面的方法调用是异步的,但是如果DocumentRenderer的另一部分花费更长的时间,我的UI线程被阻塞,那么其余的方法调用就不是异步的。例如,如果我使用用户输入覆盖渲染位置,我的渲染器有时会忽略XX页,因为他已经渲染了它们。这主要是大型PDF文件的一个问题(我使用了1300页的PDF参考,其中渲染器有时不得不忽略数百页) 我要提到的是,我定义了两个事件:一个用于ImageRendered,另一个用于RenderingFinished。要使用渲染器,我必须订阅SE事件并在UI(DocumentPager)中处理渲染图像 好的,下面是我的render()方法的代码:C# 异步PDF文档渲染器,c#,asynchronous,windows-store-apps,async-await,C#,Asynchronous,Windows Store Apps,Async Await,我目前正在使用windows 8.1本机pdf渲染器实现一个异步文档渲染器。我的目标是,让此渲染器异步渲染每个pdf页面,但应该可以更改渲染方向或覆盖当前渲染位置(这些更改由用户交互触发)。背景是,在Windows应用商店应用程序中将此渲染器用于我自己的文档寻呼机。用户应该能够跳转到XX页,而无需等待它按顺序呈现,而是立即跳转到它 背景就到此为止 到目前为止,我实现的渲染器确实工作得很好,但我注意到,它并不是真正的异步。 我的DocumentRenderer类有一个PagRender,它对一个单
public异步void Render()
{
var rendered=ImageRendered;
if(呈现==null)
{
回来
}
而(!AllPagesRendered())
{
Debug.WriteLine(标记+“---------------->方向:前进”);
while(RenderPosition在“+NewPosition”位置重新启动渲染器…);
RenderPosition=新位置;
restartdrendering=false;
}
如果(改变方向)
{
Debug.WriteLine(标记+“---------------->更改方向。重新启动渲染器…”);
改变方向=错误;
打破
}
}
如果(!EscapeLoop)
{
如果(!AllPagesRendered())
{
WriteLine(标记+“渲染未完成…渲染位置返回0”);
渲染位置=0;
}
}
其他的
{
EscapeLoop=假;
}
}
Debug.WriteLine(标记+“----------->渲染完成”);
EventHandler=RenderingFinished;
处理程序(这是新的EventArgs());
}
此呈现程序高度依赖于UI上下文,因此类似Render()的内容;这不是一种选择。我也知道async void方法不是一种好的样式,但我一直在等待这个render()方法,但没有什么不同
使整个渲染器异步的最佳方法是什么 到底是什么原因使这种方法花费了如此长的时间而冻结了UI?这是您应该优化或在后台线程上执行的部分。那么,您正在执行的哪些操作实际上在UI线程中占用了大量时间?
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());
}