C# windows phone 8.1中JSON反序列化的速度

C# windows phone 8.1中JSON反序列化的速度,c#,json,listview,windows-phone-8.1,deserialization,C#,Json,Listview,Windows Phone 8.1,Deserialization,我正在为WindowsPhone8.1开发应用程序,并使用RESTAPI和JSON与数据库通信。这一切都可以正常工作,但我在反序列化JSON和将数据加载到ListView的速度方面遇到了问题。当我加载小数据(大约20-30项)时,应用程序运行得很流畅,但如果有超过100项,我甚至要等待4-5秒才能加载到ListView。有人知道解决这个问题的有效方法吗?:)这是反序列化问题还是加载到ListView的问题 这里是反序列化的SC List<dataInfo> VypisZakaz

我正在为WindowsPhone8.1开发应用程序,并使用RESTAPI和JSON与数据库通信。这一切都可以正常工作,但我在反序列化JSON和将数据加载到ListView的速度方面遇到了问题。当我加载小数据(大约20-30项)时,应用程序运行得很流畅,但如果有超过100项,我甚至要等待4-5秒才能加载到ListView。有人知道解决这个问题的有效方法吗?:)这是反序列化问题还是加载到ListView的问题

这里是反序列化的SC

   List<dataInfo> VypisZakazekli = new List<dataInfo>();
 private async void DeserializeData(string json)
    {
        //MessageDialog msg = new MessageDialog(json);
        //await msg.ShowAsync();
        this.ListBox1.ItemsSource = null;

        CultureInfo culture = new CultureInfo("cs-CZ");

        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<dataInfo>));
        MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
        var obj = (List<dataInfo>)ser.ReadObject(stream);



        VypisZakazekli.Clear();

        foreach (dataInfo di in obj)
        {
            string barva = "";
            string iZakazka = di.zakazka;
            string sNazev = di.nazev;
            string sKod = di.kod_firmy;
            string sStatus = "Status: " + di.status_v;
            string sDruh = di.druh_zakazky;
            switch(di.barva)
            {
                case "ZE": barva = "#FF32FF1D"; break;
                case "CE": barva = "#FFFF1D1D"; break;
                case "ZL": barva = "#FFF5FF1D"; break;
                case "OR": barva = "#FFFFA31D"; break;
                case "MO": barva = "#FF1D46FF"; break;
                default: barva="x:Null"; break;

            }

            VypisZakazekli.Add(new dataInfo(iZakazka, sNazev, sKod, sStatus, sDruh,barva));
        }


        this.ListBox1.ItemsSource = VypisZakazekli;


    }
这里是XAML列表视图

 <ListView SelectionMode="None" x:Name="ListBox1" Margin="0,0,-0.167,0.167"
HorizontalAlignment="Stretch"  IsItemClickEnabled="True"
                    ContinuumNavigationTransitionInfo.ExitElementContainer="True"ItemsSource="{Binding}" >
                        <ListView.ItemContainerStyle>
                            <Style TargetType="ListViewItem">
                                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                            </Style>
                        </ListView.ItemContainerStyle>
                        <ListView.ItemTemplate>
                    <DataTemplate>

                                <Grid Background="#FF464242" Margin="0,0,0,10" Tapped="Grid_Tapped">
                                    <!--<FlyoutBase.AttachedFlyout>
                                        <MenuFlyout>
                                            <MenuFlyoutItem Text="Detail zakázky" Click="Detail" />
                                        </MenuFlyout>
                                    </FlyoutBase.AttachedFlyout>-->
                                    <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>

                                <Border Grid.Column="0" Margin="0,0,0,0" HorizontalAlignment="Left">
                                        <Rectangle  Width="20" VerticalAlignment="Stretch" Fill="{Binding barva}" />
                                    </Border>
                                    <StackPanel Grid.Column="1" Margin="5,0,10,10" >

                                        <StackPanel Orientation="Horizontal">

                                            <TextBlock Text="{Binding nazev}" Foreground="White"  FontSize="21"  />

                                </StackPanel>

                                <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding zakazka}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" Foreground="#FFFFEC31" />
                                            <TextBlock  Text="{Binding kod_firmy}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" Margin="20,0,0,0"   />

                                        </StackPanel>

                            </StackPanel>

                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

一些加速

  • 使用Json.Net反序列化(不确定是否适用于Windows 8.1)

  • 不要请求所有数据,而是一次异步请求20个项目。这对最终用户来说似乎要快得多

一些加速

  • 使用Json.Net反序列化(不确定是否适用于Windows 8.1)

  • 不要请求所有数据,而是一次异步请求20个项目。这对最终用户来说似乎要快得多


首先,为什么方法
反序列化数据
标记为
异步
?你不会等待里面的任何东西。如果您认为用
async
标记方法会使其异步,那么
async
就不是这样工作的


JSON反序列化不是问题所在。您正在同时向
列表视图提供所有项目,这并不理想。创建一个
可观察集合
,并将其绑定到
列表视图
。然后,您可以将您的项目逐个添加到此集合中,而不使
列表视图停止。

首先,为什么方法
反序列化数据
标记为
异步
?你不会等待里面的任何东西。如果您认为用
async
标记方法会使其异步,那么
async
就不是这样工作的


JSON反序列化不是问题所在。您正在同时向
列表视图提供所有项目,这并不理想。创建一个
可观察集合
,并将其绑定到
列表视图
。然后,您可以将您的项目逐个添加到此集合中,而不会使
列表视图停止。

这些都不是问题,尽管我同意应该使用Json.Net。如果一次添加20个项目,UI线程仍将努力创建UI项目,使应用程序的响应性稍微提高,但仍然无法使用。UI虚拟化是真正释放UI线程并使应用程序响应的唯一方法。@skleanthu,我说是异步的,所以应用程序不会等待UI线程。这有时称为
无限滚动
,已使用多年。如果异步添加项目,数据将异步添加到集合中,并在后台线程中,但是UI线程仍然必须在视图中实例化UI项,以显示集合中的新数据。这些都不是问题,尽管我同意应该使用Json.Net。如果一次添加20个项目,UI线程仍将努力创建UI项目,使应用程序的响应性稍微提高,但仍然无法使用。UI虚拟化是真正释放UI线程并使应用程序响应的唯一方法。@skleanthu,我说是异步的,所以应用程序不会等待UI线程。这有时称为
无限滚动
,已使用多年。如果异步添加项目,数据将异步添加到集合中,并在后台线程中,但是UI线程仍然必须在视图中实例化UI项,以显示集合中的新数据。您可以发布示例吗?我试图创建ObservableCollection,但它与List相同。如何逐个添加项目?使用绑定是很重要的,将集合绑定到您的
列表视图的
itemsource
属性。您的问题是this.ListBox1.ItemsSource=VypisZakazekli
(顺便说一句),它一次将所有数据发送到
列表视图
。看看MVVM,这段代码背后是一个灾难,你能举个例子吗?我试图创建ObservableCollection,但它与List相同。如何逐个添加项目?使用绑定是很重要的,将集合绑定到您的
列表视图的
itemsource
属性。您的问题是this.ListBox1.ItemsSource=VypisZakazekli
(顺便说一句),它一次将所有数据发送到
列表视图
。看看MVVM,这段代码背后是一场灾难
 <ListView SelectionMode="None" x:Name="ListBox1" Margin="0,0,-0.167,0.167"
HorizontalAlignment="Stretch"  IsItemClickEnabled="True"
                    ContinuumNavigationTransitionInfo.ExitElementContainer="True"ItemsSource="{Binding}" >
                        <ListView.ItemContainerStyle>
                            <Style TargetType="ListViewItem">
                                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                            </Style>
                        </ListView.ItemContainerStyle>
                        <ListView.ItemTemplate>
                    <DataTemplate>

                                <Grid Background="#FF464242" Margin="0,0,0,10" Tapped="Grid_Tapped">
                                    <!--<FlyoutBase.AttachedFlyout>
                                        <MenuFlyout>
                                            <MenuFlyoutItem Text="Detail zakázky" Click="Detail" />
                                        </MenuFlyout>
                                    </FlyoutBase.AttachedFlyout>-->
                                    <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>

                                <Border Grid.Column="0" Margin="0,0,0,0" HorizontalAlignment="Left">
                                        <Rectangle  Width="20" VerticalAlignment="Stretch" Fill="{Binding barva}" />
                                    </Border>
                                    <StackPanel Grid.Column="1" Margin="5,0,10,10" >

                                        <StackPanel Orientation="Horizontal">

                                            <TextBlock Text="{Binding nazev}" Foreground="White"  FontSize="21"  />

                                </StackPanel>

                                <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding zakazka}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" Foreground="#FFFFEC31" />
                                            <TextBlock  Text="{Binding kod_firmy}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" Margin="20,0,0,0"   />

                                        </StackPanel>

                            </StackPanel>

                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>