optimize parallel task, and clear share bookmarkId

This commit is contained in:
2020-05-21 21:44:10 +08:00
parent f8d85ef729
commit 9ca58cc814
9 changed files with 237 additions and 70 deletions

View File

@@ -33,6 +33,7 @@ namespace Pixiview.Illust
private int startIndex;
private int nextIndex;
private bool flag = false;
private ParallelTask task;
public FavoritesPage()
{
@@ -67,6 +68,16 @@ namespace Pixiview.Illust
}
}
public override void OnUnload()
{
if (task != null)
{
task.Dispose();
task = null;
}
base.OnUnload();
}
protected override IEnumerable<IllustItem> DoGetIllustList(IllustItem[] data)
{
return data;
@@ -300,14 +311,13 @@ namespace Pixiview.Illust
if (list.Length > 0)
{
#if LOG
for (var i = 0; i < list.Length; i++)
{
var item = list[i];
#if LOG
App.DebugPrint($"add bookmark ({item.BookmarkId}) - {item.Id}: {item.Title}");
#endif
item.Image = StyleDefinition.DownloadBackground;
}
#endif
nows.InsertRange(0, list);
}
}
@@ -316,21 +326,98 @@ namespace Pixiview.Illust
return;
}
ParallelTask.Start("favorite.loadimages", 0, list.Length, Configs.MaxPageThreads, i =>
SyncRemoteFavorites(list);
}
private void SyncRemoteFavorites(IllustItem[] list)
{
for (var i = 0; i < list.Length; i++)
{
var illustItem = list[i];
var data = Stores.LoadIllustPreloadData(illustItem.Id);
if (data != null && data.illust.TryGetValue(illustItem.Id, out var illust))
var item = list[i];
var data = Stores.LoadIllustPreloadData(item.Id, false);
if (data != null && data.illust.TryGetValue(item.Id, out var illust))
{
illust.CopyToItem(illustItem);
illust.CopyToItem(item);
if (data.user.TryGetValue(illust.userId, out var user))
{
illustItem.ProfileUrl = user.image;
item.ProfileUrl = user.image;
}
var url = item.ImageUrl;
if (url != null)
{
var image = Stores.LoadPreviewImage(url, false);
if (image == null)
{
image = Stores.LoadThumbnailImage(url, false);
}
if (image != null)
{
item.Image = image;
}
}
url = item.ProfileUrl;
if (url == null)
{
item.ProfileImage = StyleDefinition.ProfileNone;
}
else
{
var image = Stores.LoadUserProfileImage(url, false);
if (image != null)
{
item.ProfileImage = image;
}
}
return true;
}
App.DebugError("load.favorite", $"cannot fetch preload data, {illustItem.Id}, disposed.");
return false;
}
list = list.Where(i => i.Image == null || i.ProfileImage == null).ToArray();
if (task != null)
{
task.Dispose();
task = null;
}
task = ParallelTask.Start("favorite.loadimages", 0, list.Length, Configs.MaxPageThreads, i =>
{
var item = list[i];
if (item.ImageUrl == null)
{
var data = Stores.LoadIllustPreloadData(item.Id, true, force: true);
if (data != null && data.illust.TryGetValue(item.Id, out var illust))
{
illust.CopyToItem(item);
if (data.user.TryGetValue(illust.userId, out var user))
{
item.ProfileUrl = user.image;
}
}
else
{
App.DebugError("load.favorite", $"cannot fetch preload data, {item.Id}, disposed.");
return false;
}
}
if (item.Image == null && item.ImageUrl != null)
{
item.Image = StyleDefinition.DownloadBackground;
var image = Stores.LoadThumbnailImage(item.ImageUrl, true, force: true);
if (image != null)
{
item.Image = image;
}
}
if (item.ProfileImage == null && item.ProfileUrl != null)
{
item.ProfileImage = StyleDefinition.ProfileNone;
var userImage = Stores.LoadUserProfileImage(item.ProfileUrl, true, force: true);
if (userImage != null)
{
item.ProfileImage = userImage;
}
}
return true;
}, () =>
{
Stores.SaveFavoritesIllusts();

View File

@@ -598,7 +598,32 @@ namespace Pixiview.Illust
{
if (item.Image == null)
{
item.Image = StyleDefinition.DownloadBackground;
var url = Configs.GetThumbnailUrl(item.ImageUrl);
var image = Stores.LoadPreviewImage(url, false);
if (image == null)
{
image = Stores.LoadThumbnailImage(url, false);
}
if (image != null)
{
item.Image = image;
}
item.ImageUrl = url;
}
if (item.ProfileImage == null)
{
if (item.ProfileUrl == null)
{
item.ProfileImage = StyleDefinition.ProfileNone;
}
else
{
var image = Stores.LoadUserProfileImage(item.ProfileUrl, false);
if (image != null)
{
item.ProfileImage = image;
}
}
}
item.IsFavorite =
item.BookmarkId != null ||
@@ -616,30 +641,30 @@ namespace Pixiview.Illust
task.Dispose();
task = null;
}
task = ParallelTask.Start("collection.load", 0, collection.Count, Configs.MaxThreads, i =>
var list = collection.Where(i => i.Image == null || i.ProfileImage == null).ToArray();
task = ParallelTask.Start("collection.load", 0, list.Length, Configs.MaxThreads, i =>
{
if (!collection.Running)
{
return false;
}
var illust = collection[i];
if (illust.ImageUrl != null)
var illust = list[i];
if (illust.Image == null && illust.ImageUrl != null)
{
var url = Configs.GetThumbnailUrl(illust.ImageUrl);
var image = Stores.LoadPreviewImage(url, false);
if (image == null)
{
image = Stores.LoadThumbnailImage(url);
}
illust.Image = StyleDefinition.DownloadBackground;
var image = Stores.LoadThumbnailImage(illust.ImageUrl, true, force: true);
if (image != null)
{
illust.Image = image;
}
}
if (illust.ProfileUrl != null)
if (illust.ProfileImage == null && illust.ProfileUrl != null)
{
var userImage = Stores.LoadUserProfileImage(illust.ProfileUrl);
illust.ProfileImage = StyleDefinition.ProfileNone;
var userImage = Stores.LoadUserProfileImage(illust.ProfileUrl, true, force: true);
if (userImage != null)
{
illust.ProfileImage = userImage;

View File

@@ -62,8 +62,9 @@ namespace Pixiview.Illust
{
return null;
}
return data.body.page.follow.Select(i =>
var illusts = data.body.page.follow.Select(i =>
data.body.thumbnails.illust.FirstOrDefault(l => l.illustId == i.ToString())?.ConvertToItem());
return illusts;
}
protected override IllustData DoLoadIllustData(bool force)
@@ -78,7 +79,10 @@ namespace Pixiview.Illust
return;
}
await ScrollToTopAsync(scrollView);
StartLoad(true);
lastUpdated = default;
StartLoad(false);
}
private void SearchBar_SearchButtonPressed(object sender, EventArgs e)

View File

@@ -308,7 +308,7 @@ namespace Pixiview.Illust
{
if (user.ProfileUrl != null)
{
var userImage = Stores.LoadUserProfileImage(user.ProfileUrl);
var userImage = Stores.LoadUserProfileImage(user.ProfileUrl, true);
if (userImage != null)
{
user.ProfileImage = userImage;
@@ -326,10 +326,10 @@ namespace Pixiview.Illust
if (illust.ImageUrl != null)
{
var url = Configs.GetThumbnailUrl(illust.ImageUrl);
var image = Stores.LoadPreviewImage(url, false);
var image = Stores.LoadPreviewImage(url, true, force: false);
if (image == null)
{
image = Stores.LoadThumbnailImage(url);
image = Stores.LoadThumbnailImage(url, true);
}
if (image != null)
{

View File

@@ -439,7 +439,7 @@ namespace Pixiview.Illust
}
}
item.Loading = true;
var image = Stores.LoadPreviewImage(item.PreviewUrl, force: force);
var image = Stores.LoadPreviewImage(item.PreviewUrl, true, force: force);
if (image != null)
{
item.Image = image;
@@ -649,7 +649,7 @@ namespace Pixiview.Illust
isPreloading = true;
var illustItem = IllustItem;
// force to reload
var preload = Stores.LoadIllustPreloadData(illustItem.Id, force);
var preload = Stores.LoadIllustPreloadData(illustItem.Id, true, force: force);
if (preload != null && preload.illust.TryGetValue(illustItem.Id, out var illust))
{
illust.CopyToItem(illustItem);