为什么这个简单的 C# UWP Win2D 程序偶尔无法呈现图像

本文关键字:偶尔 图像 程序 Win2D 简单 UWP 为什么 | 更新日期: 2023-09-27 18:33:41

嗨,我的第一篇文章,所以请温柔:)

我编写了这个简单的 C# UWP Win2D 程序,该程序有时会随机无法在屏幕上呈现图像。该程序在大约 90% 的时间内运行没有问题,并且它应该渲染图像,奇怪的是,尽管它时不时地无法渲染它。

当它失败时,它仍然将画布清除到正确的颜色,但它不会渲染任何其他内容。该程序似乎运行正常,但是当我在绘制方法或更新方法上放置断点时,不会发生中断。

"打破所有"确实破坏了程序,但它通知了我"你的应用已进入中断状态,但没有代码要显示,因为所有线程都在执行外部代码(通常是系统或框架代码(">

我希望这可以解释我目前面临的情况,我已经包含了导致此问题的代码,希望比我知识渊博的人可以帮助我找到补救措施。

这是我的 XAML 代码...

<Page
    x:Class="TheGrid.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TheGrid"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:canvas="using:Microsoft.Graphics.Canvas.UI.Xaml"
    mc:Ignorable="d" 
    Unloaded="Page_Unloaded">
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <canvas:CanvasAnimatedControl 
            x:Name="canvas" 
            ClearColor="Bisque" Update="canvas_Update" Draw="canvas_Draw" CreateResources="canvas_CreateResources"
            />
    </Grid>
</Page>

这是背后的 C# 代码...

public sealed partial class MainPage : Page
    {
        CanvasBitmap bitmap1;
        public MainPage()
        {
            this.InitializeComponent();
        }
        private void canvas_CreateResources(CanvasAnimatedControl sender, CanvasCreateResourcesEventArgs args)
        {
            args.TrackAsyncAction(Canvas_CreateResourcesAsync(sender).AsAsyncAction());
        }
        async Task Canvas_CreateResourcesAsync(CanvasAnimatedControl sender)
        {
            bitmap1 = await CanvasBitmap.LoadAsync(sender, "Assets/Images/testimage.png");
        }     
        private void canvas_Update(ICanvasAnimatedControl sender, CanvasAnimatedUpdateEventArgs args)
        {
            // Do stuff
        }
        private void canvas_Draw(ICanvasAnimatedControl sender, CanvasAnimatedDrawEventArgs args)
        {
            args.DrawingSession.DrawImage(bitmap1, 256, 256);
        }
        private void Page_Unloaded(object sender, RoutedEventArgs e)
        {
            this.canvas.RemoveFromVisualTree();
            this.canvas = null;
        }
    }

提前感谢您提供的任何帮助,如果需要更多信息,请告诉我。

编辑 1.(我试图通过删除来简化问题

args.TrackAsyncAction(Canvas_CreateResourcesAsync(sender).AsAsyncAction());

async Task Canvas_CreateResourcesAsync(CanvasAnimatedControl sender) { bitmap1 = await CanvasBitmap.LoadAsync(sender, "Assets/Images/testimage.png"); }

和替换

args.DrawingSession.DrawImage(bitmap1, 256, 256);

args.DrawingSession.DrawCircle(256, 256, 128, Colors.Black, 16);

这似乎可以防止问题发生,因此我只能假设这是我使用的异步模式的问题。

为什么这个简单的 C# UWP Win2D 程序偶尔无法呈现图像

我认为问题就在这里

private void canvas_CreateResources(CanvasAnimatedControl sender, CanvasCreateResourcesEventArgs args)
    {
        args.TrackAsyncAction(Canvas_CreateResourcesAsync(sender).AsAsyncAction());
    }

使用异步时,我的老师告诉我始终使用 await 和异步功能。因为这会导致问题。

一些阅读来源:https://msdn.microsoft.com/en-us/library/hh191443.aspx