在我们的应用程序中,我们存储了两个文件副本 - 一个批准文件和一个未批准文件。两者分别跟踪他们的版本。当未批准的文件被批准后,其所有版本都将作为新版本添加到批准的文件中。为了做到这一点,我的代码必须将每个版本分别上传到批准的文件夹中,并且每次使用该版本的信息更新该项目。如何确保我的程序上传按正确的顺序完成?
由于某些原因,这并不总是正常工作。在我最新的场景中,最新版本首先上传,然后所有剩余版本都上传。但是,我的代码显然应该首先上传其他版本,这是我写入的顺序。为什么会发生这种情况?如果可能的话,我如何确保版本以正确的顺序上传?
澄清 - 这不是枚举的问题 - 我以正确的顺序得到以前的版本。发生的事情是在循环之后写入的最终版本正在循环之前上传。这对我来说真的没有任何意义。
下面是相关代码的精简版。
//These three are initialized earlier in the code.
SPList list; //The document library
SPListItem item; //The list item in the Unapproved folder
int AID; //The item id of the corresponding item in the Approved folder.
byte[] contents; //Not initialized.
/* These uploads are happening second when they should happen first. */
if (item.File.Versions.Count > 0)
{
//This loop is actually a separate method call if that matters.
//For simplicity I expanded it here.
foreach (SPFileVersion fVer in item.File.Versions)
{
if (!fVer.IsCurrentVersion)
{
contents = fVer.OpenBinary();
SPFile fSub = aFolder.Files.Add(fVer.File.Name, contents, u1, fVer.CreatedBy, dt1, fVer.Created);
SPListItem subItem = list.GetItemById(AID);
//This method updates the newly uploaded version with the field data of that version.
UpdateFields(item.Versions.GetVersionFromLabel(fVer.VersionLabel), subItem);
}
}
}
/* This upload happens first when it should happen last. */
//Does the same as earlier loop, but for the final version.
contents = item.File.OpenBinary();
SPFile f = aFolder.Files.Add(item.File.Name, contents, u1, u2, dt1, dt2);
SPListItem finalItem = list.GetItemById(AID);
UpdateFields(item.Versions[0], finalItem);
item.Delete();
SPFile.Versions按相反顺序存储,不包含最新版本;最新版本是SPFile本身。 – 2010-08-11 20:14:41
这确实解释了为什么您必须单独执行UpdateField,并且现在我会看到代码是如何变化的。 如果所有的代码都是在单个线程中执行的,那么您原本应该按照您指定的方式工作。 但是,您所描述的行为表明UpdateFields方法中的代码正在后台线程中工作,这将阻止对订单的任何控制。您可能需要查看UpdateFields的代码,以确保它与主代码在同一线程中运行。 – Russ 2010-08-12 12:39:15