optimize<Avatar>: use task queue to download avatar one by one

This commit is contained in:
leo 2021-04-01 12:03:35 +08:00
parent c22ea8f4cf
commit 6a9ee67524

View file

@ -73,6 +73,11 @@ namespace SourceGit.Helpers {
/// </summary> /// </summary>
private static Dictionary<string, BitmapImage> loaded = new Dictionary<string, BitmapImage>(); private static Dictionary<string, BitmapImage> loaded = new Dictionary<string, BitmapImage>();
/// <summary>
/// Loader to join in queue.
/// </summary>
private static Task loader = null;
/// <summary> /// <summary>
/// Render implementation. /// Render implementation.
/// </summary> /// </summary>
@ -150,23 +155,37 @@ namespace SourceGit.Helpers {
requesting.Add(email, new List<Avatar>()); requesting.Add(email, new List<Avatar>());
requesting[email].Add(this); requesting[email].Add(this);
Task.Run(() => { Action job = () => {
try { try {
var agent = new WebClient(); HttpWebRequest req = WebRequest.CreateHttp("https://www.gravatar.com/avatar/" + md5 + "?d=404");
var data = agent.DownloadData("https://www.gravatar.com/avatar/" + md5 + "?d=404"); req.Timeout = 2000;
//var data = agent.DownloadData("https://cdn.s.loli.top/avatar/" + md5 + "?d=404"); req.Method = "GET";
File.WriteAllBytes(filePath, data);
HttpWebResponse rsp = req.GetResponse() as HttpWebResponse;
if (rsp.StatusCode == HttpStatusCode.OK) {
using (Stream reader = rsp.GetResponseStream())
using (FileStream writer = File.OpenWrite(filePath)) {
reader.CopyTo(writer);
}
if (requesting.ContainsKey(email)) { if (requesting.ContainsKey(email)) {
Dispatcher.Invoke(() => { Dispatcher.Invoke(() => {
var img = new BitmapImage(new Uri(filePath)); var img = new BitmapImage(new Uri(filePath));
loaded[email] = img; loaded[email] = img;
foreach (var one in requesting[email]) one.Source = img; foreach (var one in requesting[email]) one.Source = img;
requesting.Remove(email);
}); });
} }
}
} catch { } } catch { }
});
requesting.Remove(email);
};
if (loader != null && !loader.IsCompleted) {
loader = loader.ContinueWith(t => { job(); });
} else {
loader = Task.Run(job);
}
} }
/// <summary> /// <summary>