Search code examples
c#multithreadinguwprendertargetbitmap

UWP RenderTargetBitmap.RenderAsync Hangs


I wrote a function to rasterize stroke data from an InkCanvas, but for some reason renderBMP.RenderAsync(...) hangs indefinitely. Any advice?

    RenderTargetBitmap rasterizePage(int pageNumber) {

        if (readStrokes(pageNumber) == null) return null;

        InkCanvas virtualInkCanvas = new InkCanvas();
        virtualInkCanvas.Width = MainGrid.ActualWidth / 2;
        virtualInkCanvas.Height = MainGrid.ActualHeight;

        foreach (InkStroke stroke in readStrokes(pageNumber))
        {
            virtualInkCanvas.InkPresenter.StrokeContainer.AddStroke(stroke.Clone());
        }

        RenderTargetBitmap renderBMP = new RenderTargetBitmap();
        
        System.Diagnostics.Debug.WriteLine("Start Rendering page " + pageNumber.ToString());
        var task = renderBMP.RenderAsync(virtualInkCanvas, (int)(MainGrid.ActualWidth / 2), (int)MainGrid.ActualHeight);
        task.AsTask().Wait();
        System.Diagnostics.Debug.WriteLine("Done Rendering page " + pageNumber.ToString());
        return renderBMP;

    }

Solution

  • As Theodor Zoulias said, you synchronous call to async methods make thread stuck, you could use await keyword to repalce task.AsTask().Wait();, please refer to the following code

    public async Task<RenderTargetBitmap> rasterizePage(int pageNumber)
    {
    
        if (readStrokes(pageNumber) == null) return null;
    
        InkCanvas virtualInkCanvas = new InkCanvas();
        virtualInkCanvas.Width = MainGrid.ActualWidth / 2;
        virtualInkCanvas.Height = MainGrid.ActualHeight;
    
        foreach (InkStroke stroke in readStrokes(pageNumber))
        {
            virtualInkCanvas.InkPresenter.StrokeContainer.AddStroke(stroke.Clone());
        }
    
        RenderTargetBitmap renderBMP = new RenderTargetBitmap();
    
        System.Diagnostics.Debug.WriteLine("Start Rendering page " + pageNumber.ToString());
        await renderBMP.RenderAsync(virtualInkCanvas, (int)(MainGrid.ActualWidth / 2), (int)MainGrid.ActualHeight);
    
        System.Diagnostics.Debug.WriteLine("Done Rendering page " + pageNumber.ToString());
        return renderBMP;    
    }
    

    And for getting more info about Threading and async programming document.