Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在Windows 10 UWP应用程序中垃圾收集运行得太频繁?_C#_Windows_Garbage Collection_Win Universal App_Windows 10 Mobile - Fatal编程技术网

C# 为什么在Windows 10 UWP应用程序中垃圾收集运行得太频繁?

C# 为什么在Windows 10 UWP应用程序中垃圾收集运行得太频繁?,c#,windows,garbage-collection,win-universal-app,windows-10-mobile,C#,Windows,Garbage Collection,Win Universal App,Windows 10 Mobile,为什么垃圾收集会阻止Windows10UWP中的UI线程?(可能不是。但性能诊断工具表示垃圾收集器正在UI线程中运行) 此外,如果正在运行垃圾收集,则应用程序不会响应。 在WindowsPhone8.1中,它工作正常,不经常调用垃圾回收。 更新: 诊断工具的更新结果: 更新2 我需要从外部API获取大型对象(过去2年每月1000-2000个对象)。API以json格式返回数据。我使用Newtonsoft.Json来反序列化对象。因此,每个请求从API获得1-2MB的临时数据是理想的行为。我使

为什么垃圾收集会阻止Windows10UWP中的UI线程?(可能不是。但性能诊断工具表示垃圾收集器正在UI线程中运行) 此外,如果正在运行垃圾收集,则应用程序不会响应。 在WindowsPhone8.1中,它工作正常,不经常调用垃圾回收。

更新: 诊断工具的更新结果:

更新2 我需要从外部API获取大型对象(过去2年每月1000-2000个对象)。API以json格式返回数据。我使用Newtonsoft.Json来反序列化对象。因此,每个请求从API获得1-2MB的临时数据是理想的行为。我使用FieldMedic分析了来自设备的PerfView日志,发现收集的反序列化是最昂贵的操作。Windows Phone 8.1的结果相同。Windows 10中的方法数6734与WP 8.1中的方法数421之间的巨大差异仅在于JITStats

适用于Windows Phone 8.1的同一应用程序不会阻止UI线程。 问题是“为什么在Windows10UWP中需要如此多的垃圾收集资源?”

更新3 演示项目演示了这种差异。在WP8.1中,json序列化/反序列化不能阻止UI线程。在Windows 10中,UI线程被GC阻止

private void StartButton_OnClick(object sender, RoutedEventArgs e)
    {        
        Task.Factory.StartNew(async () =>
        {
            var storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///trips.json"));
            var content = await FileIO.ReadTextAsync(storageFile);
            for (int i = 0; i < 100; i++)
            {
                var trips = JsonConvert.DeserializeObject<IEnumerable<Trip>>(content);                    
            }
        });
    }
private void StartButton_OnClick(对象发送方,RoutedEventArgs e)
{        
Task.Factory.StartNew(异步()=>
{
var storageFile=await storageFile.getfilefromApplicationUrisync(新Uri(“ms”)-appx:///trips.json"));
var content=await FileIO.ReadTextAsync(storageFile);
对于(int i=0;i<100;i++)
{
var trips=JsonConvert.DeserializeObject(内容);
}
});
}
链接到演示项目:

通常,您无法控制垃圾收集器何时运行。它不能在UI线程上运行。根据结果,网络操作占用了您大部分时间。您可以检查更新吗?您仍然确定垃圾收集器不能在UI线程中运行吗?为什么应用程序在这种情况下没有响应?这里没有其他活动。@vadiblis:GC通常在一个单独的线程中运行,但可能需要停止所有其他线程来完成它的工作,因此您仍然会将其视为暂停。谢谢@Joey。我如何调查长时间暂停(10秒)的确切原因?在WP 8.1中,需要2毫秒的时间。显然,您一次分配了太多不需要很长时间的资源。我不确定它在UWP应用程序中的效果如何,但对于我使用的普通.NET应用程序,它可以告诉您很多有关应用程序运行时行为的信息,包括告诉您何时以及分配了多少特定类型的对象。