C# 将数据下载到应用程序的速度非常慢
我正在编写uwp应用程序 我尝试下载json并显示数据 我向方法lan和lon发送变量,将其放入并链接和下载数据 位置代码:C# 将数据下载到应用程序的速度非常慢,c#,visual-studio,uwp,C#,Visual Studio,Uwp,我正在编写uwp应用程序 我尝试下载json并显示数据 我向方法lan和lon发送变量,将其放入并链接和下载数据 位置代码: public class LocationManager { public async static Task<Geoposition> GetPosition() { var accessStatus = await Geolocator.RequestAccessAsync(); if (accessSt
public class LocationManager
{
public async static Task<Geoposition> GetPosition()
{
var accessStatus = await Geolocator.RequestAccessAsync();
if (accessStatus != GeolocationAccessStatus.Allowed) throw new Exception();
var geolocator = new Geolocator { DesiredAccuracyInMeters = 0 };
var position = await geolocator.GetGeopositionAsync();
return position;
}
}
我的问题是延迟,我点击按钮,它会在30-40秒内显示数据。互联网一切都好。为什么我会有这么大的延迟?嗨,你是用fiddler或类似的东西来查看包裹大小的吗?如果不是的话,我会从这里开始如果这不是你的问题,我可能认为序列化需要很多时间。我在json.net上获得了很好的过期性,接下来我会尝试一下。如果您的包大小很大,您可能需要考虑使用copression-json.net也有很好的“快速”实现,如果您需要一个链接,请告诉我。还有一个建议:您的函数都是异步的,但您使用的是wait,这最终会使您的方法停止。异步调用完成时,您可能希望使用回调事件,以便在收到数据时处理数据。@Tripleee这就是
await
所做的。@Eugene使用Fiddler捕获您的包(如上所述)进行一些研究。还有可能api.openweather
本身速度很慢。另外,请注意:不要为每个请求创建http客户端,HttpClient
(在System.Net和UWP模拟中)意味着在应用程序的整个生命周期中实例化一次()@Sergey.quixoticaxis.Ivanov Hi Sergey,是的,我知道这是wait做的,但我的意思不同:private readonly Func executionFunc=delegate(){return 1;};私有操作AsyncCallback=委托(IAsyncResult ar){//DoStuff};private void DoSomething(){executionFunc.BeginInvoke(新的异步回调(异步回调),executionFunc);}
private const string APPID = "f3c45b5a19426de9ea6ba7eb6c6969d7";
public async static Task<RootObject> GetWeather(double lat, double lon)
{
var http = new HttpClient();
var url = String.Format(
"http://api.openweathermap.org/data/2.5/weather?lat={0}&lon={1}&units=metric&APPID="+APPID, lat, lon);
var response = await http.GetAsync(url);
var result = await response.Content.ReadAsStringAsync();
var serializer = new DataContractJsonSerializer(typeof(RootObject));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
var data = (RootObject) serializer.ReadObject(ms);
return data;
}
}
[DataContract]
public class Coord
{
[DataMember]
public double lon { get; set; }
[DataMember]
public double lat { get; set; }
}
[DataContract]
public class Weather
{
[DataMember]
public int id { get; set; }
[DataMember]
public string main { get; set; }
[DataMember]
public string description { get; set; }
[DataMember]
public string icon { get; set; }
}
[DataContract]
public class Main
{
[DataMember]
public double temp { get; set; }
[DataMember]
public double pressure { get; set; }
[DataMember]
public double humidity { get; set; }
[DataMember]
public double temp_min { get; set; }
[DataMember]
public double temp_max { get; set; }
}
[DataContract]
public class Wind
{
[DataMember]
public double speed { get; set; }
[DataMember]
public double deg { get; set; }
}
/*
[DataContract]
public class Rain
{
[DataMember]
public double __invalid_name__1h { get; set; }
}
*/
[DataContract]
public class Clouds
{
[DataMember]
public int all { get; set; }
}
[DataContract]
public class Sys
{
[DataMember]
public int type { get; set; }
[DataMember]
public int id { get; set; }
[DataMember]
public double message { get; set; }
[DataMember]
public string country { get; set; }
[DataMember]
public int sunrise { get; set; }
[DataMember]
public int sunset { get; set; }
}
[DataContract]
public class RootObject
{
[DataMember]
public Coord coord { get; set; }
[DataMember]
public List<Weather> weather { get; set; }
[DataMember]
public string @base { get; set; }
[DataMember]
public Main main { get; set; }
[DataMember]
public Wind wind { get; set; }
/*
[DataMember]
public Rain rain { get; set; }
*/
[DataMember]
public Clouds clouds { get; set; }
[DataMember]
public int dt { get; set; }
[DataMember]
public Sys sys { get; set; }
[DataMember]
public int id { get; set; }
[DataMember]
public string name { get; set; }
[DataMember]
public int cod { get; set; }
}
public async void WeatherDisplay()
{
try
{
//var position = await LocationManager.GetPosition();
var geoLocator = new Geolocator();
geoLocator.DesiredAccuracy = PositionAccuracy.High;
Geoposition pos = await geoLocator.GetGeopositionAsync();
var lat = pos.Coordinate.Point.Position.Latitude;
var lon = pos.Coordinate.Point.Position.Longitude;
RootObject myWeather =
await OpenWeatherMapProxy.GetWeather(
lat,
lon);
Temperature.Text = ((int)myWeather.main.temp).ToString() + "°C";
// DescriptionTextBlock.Text = myWeather.weather[0].description;
City.Text = myWeather.name;
}
catch
{
}
}