嗨,我的第一篇文章,所以请温柔:)
我编写了这个简单的 C# UWP Win2D 程序,它有时会随机无法在屏幕上渲染图像。该程序在大约 90% 的时间内运行没有问题,并且它应该渲染图像,但奇怪的是,它时不时地无法渲染它。
当它失败时,它仍然将画布清除为正确的颜色,但它不会渲染任何其他内容。该程序似乎运行正常,但是当我在 draw 方法或 update 方法上放置一个断点时,不会发生中断。
'Break all' 确实破坏了程序,但它告诉我“您的应用程序已进入中断状态,但没有代码可显示,因为所有线程都在执行外部代码(通常是系统或框架代码)”
我希望这能解释我目前面临的情况,我已经包含了导致这个问题的代码,希望比我更有知识的人可以帮助我找到补救措施。
这是我的 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);
这似乎可以防止问题发生,所以我只能假设这是我正在使用的异步模式的问题。