Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步PDF文档渲染器_C#_Asynchronous_Windows Store Apps_Async Await - Fatal编程技术网

C# 异步PDF文档渲染器

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,它对一个单

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

背景就到此为止

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

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

好的,下面是我的render()方法的代码:

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());
}