我有一个async Task SaveQueue()
{
for (;;)
{
try
{
await Task.Delay(7500);
dbUpload.Visibility = Visibility.Visible;
dbUploadProgress.Value = 0;
var q = new ObservableCollection<Picture>(manager.Queue.ToList().AsEnumerable());
manager.Queue.Clear();
var imgcount = q.Count();
using (var pc = new PicsContext())
{
for (int i = 0; i < imgcount; i++)
{
var tags = q[i].GetTags();
try
{
pc.Sites.Attach(q[i].Site); // I'm actually not sure how to use this.
}
catch { }
var curUrl = q[i].Url;
if (pc.Pictures.FirstOrDefault(o => o.Url == curUrl) != null)
{
await Task.Delay(1);
dbUploadProgress.Value = (i + 1) / (double)imgcount;
dbUploadText.Text = "Skipping images...";
continue;
}
foreach (var t in tags)
{
var tag = pc.Tags.Where(o => o.Name == t).FirstOrDefault();
if (tag == null)
{
tag = new ViewModel.Tag(t);
}
q[i].Tags.Add(tag);
}
pc.Pictures.Add(q[i]);
try
{
await pc.SaveChangesAsync();
}
catch { }
dbUploadProgress.Value = (i + 1) / (double)imgcount;
var labelText = string.Format("{0}/{1} ({2:0.00}%)", i, imgcount, dbUploadProgress.Value);
dbUploadText.Text = labelText;
#if DEBUG
System.Diagnostics.Debug.WriteLine(labelText);
#endif
await Task.Delay(2);
}
}
q.Clear();
MainWindow.AddLog(string.Format("Saved {0} pictures.", imgcount));
dbUpload.Visibility = Visibility.Collapsed;
await Task.Delay(1500);
}
catch(Exception ex) { AddLog(ex.Message); if (ex.InnerException != null) AddLog(ex.InnerException.Message); }
if (stopped)
break;
}
}
任务,用于将图像保存到数据库中:
Queue
它通常可以节省大约80-100图像/分钟,这是不可接受的,因为在大多数情况下Tags
存储2500-10000个对象。这使得使用起来非常不方便。
我认为发生这种情况是正确的,因为我分别保存了每一行吗?还需要一段时间来检查Duplicate
表中是否存在标记。
我这样做的原因是我必须经常检查图像标签。我必须确保标签已经存在,因为如果有,我添加它,它会抛出Site
异常并且不保存图像。这也意味着我必须在检查标签是否存在之前保存以前的帖子数据,否则它可能无法检测到刚刚添加的标签,多次添加标签并发生相同的结果。
有没有办法让它自动保存不在数据库中的标签,只是让它指向这些标签?这意味着我可以立即保存整个列表,而不是单独发送每个图像。
另外,我正在使用另一个上下文将Image
添加到数据库中。当我尝试使用此任务添加一些图像时,它会抛出一个错误,表明该站点已经在数据库中。出于某种原因,每次添加.Attach()
时它都会继续尝试插入网站。添加{{1}}调用部分解决了这个问题,但我不确定它是如何工作的。我知道我做错了什么,因为它偶尔抛出一个异常并且没有附加图像的网站。我该如何优化呢?
感谢您的阅读,欢呼!