UWP C# 中的访问冲突(内存泄漏)
Access Voilation (Memory Leak) in UWP C#
我正在开发具有 Order
Class 的 UWP 应用程序,它绑定到 UWP UI。一切正常,然后开始崩溃并出现 Access Violation
错误。我调试并发现我在 XAML 中有一个 TextBox
,它绑定到订单 Class 的 属性 之一。 [还有其他几个以完全相同的方式来自同一个 class]。现在,当我通过计算值(它是一个浮点值)更新订单的 属性 时,它被设置为在 UI 上更新,它很好地更新其他字段但是当我尝试设置这个字段时崩溃与内存冲突。我有 10 个不同的字段,它们在同一函数中很好地绑定到来自同一对象的相同 UI,
<TextBox x:Name="Margin" IsReadOnly="True" MinWidth="100" MaxWidth="120" MaxLength="10" Header="Margin (£)" Padding="5"
Margin="5,5,5,0" Text="{x:Bind ViewModel.SelectedOrder.Margin, Mode=TwoWay}" RelativePanel.Below="GridOrderItems"
RelativePanel.RightOf="Parcel" />
<TextBox x:Name="txtMarginP" IsReadOnly="True" MinWidth="100" MaxWidth="120" MaxLength="5" Header="Margin (%)" Padding="5"
Margin="5,5,5,0" Text="{x:Bind ViewModel.SelectedOrder.MarginP, Mode=TwoWay}"
RelativePanel.RightOf="Margin" RelativePanel.Below="GridOrderItems" />
上面的字段通过没有错误,但是字段 txtMarginP
失败并出现错误。
private async Task UpdateCart(float shippingprice = 0)
{
...
ViewModel.SelectedOrder.Margin = calculatedMargin;
ViewModel.SelectedOrder.MarginP = calculatedMarginP;
...
}
这是产生错误的函数调用。我计算保证金(如 float
)并通过。它曾经有效。然后它开始失败,而我在与它无关的其他屏幕上工作,并且命令 class 而这个 UI 没有改变。
Excat 错误是 Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
出现在 Orderdetail.g.cs
文件中 [由 XAML 编译器自动生成。正确设置对象值。
我尝试使用 DispatcherQueue 在我的对象中设置值,但它没有解决问题。由于没有任何已知的变化,我相信某些编译器设置在 Visual Studio 或其他更新之一中发生了变化。但我无法弄清楚,也无法调试它来解决它。任何想法表示赞赏。谢谢。
编辑---
在更改了一些代码 [以对称顺序重新排列那里的调用] 之后,我确定了应用程序停止崩溃的情况,如果我将我的 ObservableCollection 更改为 List,但它不会绑定,并且即使我更改我分配的项目也不可见Grid.Itemsource
事实证明,我在 listview
中绑定了 combobox
中的一些数据。因为当我们重新加载产品时我必须多次绑定那个 Combobox。它导致 XAML
内存泄漏并发疯。我必须从 ListView 中删除 ComboBox 并将其替换为 AutoSuggestBox 或 [取决于您的工作流程] 或限制您可以在组合框中加载的项目数量。我无法限制它们,因为我有大约 700 条记录要绑定...它们将 2-3 行复制到 1400-2100 个元素进行管理,并且所有人都可以观察到。
重写一些主要部分以避免它。
我正在开发具有 Order
Class 的 UWP 应用程序,它绑定到 UWP UI。一切正常,然后开始崩溃并出现 Access Violation
错误。我调试并发现我在 XAML 中有一个 TextBox
,它绑定到订单 Class 的 属性 之一。 [还有其他几个以完全相同的方式来自同一个 class]。现在,当我通过计算值(它是一个浮点值)更新订单的 属性 时,它被设置为在 UI 上更新,它很好地更新其他字段但是当我尝试设置这个字段时崩溃与内存冲突。我有 10 个不同的字段,它们在同一函数中很好地绑定到来自同一对象的相同 UI,
<TextBox x:Name="Margin" IsReadOnly="True" MinWidth="100" MaxWidth="120" MaxLength="10" Header="Margin (£)" Padding="5"
Margin="5,5,5,0" Text="{x:Bind ViewModel.SelectedOrder.Margin, Mode=TwoWay}" RelativePanel.Below="GridOrderItems"
RelativePanel.RightOf="Parcel" />
<TextBox x:Name="txtMarginP" IsReadOnly="True" MinWidth="100" MaxWidth="120" MaxLength="5" Header="Margin (%)" Padding="5"
Margin="5,5,5,0" Text="{x:Bind ViewModel.SelectedOrder.MarginP, Mode=TwoWay}"
RelativePanel.RightOf="Margin" RelativePanel.Below="GridOrderItems" />
上面的字段通过没有错误,但是字段 txtMarginP
失败并出现错误。
private async Task UpdateCart(float shippingprice = 0)
{
...
ViewModel.SelectedOrder.Margin = calculatedMargin;
ViewModel.SelectedOrder.MarginP = calculatedMarginP;
...
}
这是产生错误的函数调用。我计算保证金(如 float
)并通过。它曾经有效。然后它开始失败,而我在与它无关的其他屏幕上工作,并且命令 class 而这个 UI 没有改变。
Excat 错误是 Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
出现在 Orderdetail.g.cs
文件中 [由 XAML 编译器自动生成。正确设置对象值。
我尝试使用 DispatcherQueue 在我的对象中设置值,但它没有解决问题。由于没有任何已知的变化,我相信某些编译器设置在 Visual Studio 或其他更新之一中发生了变化。但我无法弄清楚,也无法调试它来解决它。任何想法表示赞赏。谢谢。
编辑---
在更改了一些代码 [以对称顺序重新排列那里的调用] 之后,我确定了应用程序停止崩溃的情况,如果我将我的 ObservableCollection 更改为 List,但它不会绑定,并且即使我更改我分配的项目也不可见Grid.Itemsource
事实证明,我在 listview
中绑定了 combobox
中的一些数据。因为当我们重新加载产品时我必须多次绑定那个 Combobox。它导致 XAML
内存泄漏并发疯。我必须从 ListView 中删除 ComboBox 并将其替换为 AutoSuggestBox 或 [取决于您的工作流程] 或限制您可以在组合框中加载的项目数量。我无法限制它们,因为我有大约 700 条记录要绑定...它们将 2-3 行复制到 1400-2100 个元素进行管理,并且所有人都可以观察到。
重写一些主要部分以避免它。