UWP RenderTargetBitmap.RenderAsync зависает

Я написал функцию для растеризации данных обводки из InkCanvas, но по какой-то причине renderBMP.RenderAsync(...) зависает на неопределенный срок. Любой совет?

    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;

    }

🤔 А знаете ли вы, что...
C# обладает сборщиком мусора, который автоматически управляет памятью, что снижает риск утечек памяти.


1
16
1

Ответ:

Решено

Как сказал Теодор Зулиас, ваш синхронный вызов асинхронных методов приводит к зависанию потока, вы можете использовать ключевое слово await для замены task.AsTask().Wait();, пожалуйста, обратитесь к следующему коду

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

И для получения дополнительной информации о Документ по многопоточности и асинхронному программированию.