我有一个TFS ISubscriber
实现,用于修改WorkItemChangedEvent
上的工作项。由于与TFS Build的争用,有时我们会得到ItemAlreadyUpdatedOnServerException
,将工作项与构建相关联。
虽然事件处理程序更新了多个工作项字段,但只有在更新历史记录字段时才会发生冲突。我们正在使用WorkItem.Save(SaveFlags.MergeAll)
来保存工作项。
我想尝试在此特定方案中重试工作项更新。花了很多时间思考这个并看看API中可能的内容,我能想到的最好的是:
WorkItem.Save(SaveFlags.MergeAll)
ItemAlreadyUpdatedOnServerException
,然后抓住阻止块Fields
而非IsDirty
的所有IsComputed
WorkItem.SyncToLatest()
Field
值。我有理由相信这是可行的,但我想知道是否有任何我错过的内容或者是否有更好的TFS API原生解决方案?
(抱歉没有代码,我可以在桌面上更新并提供样本)
答案 0 :(得分:0)
我选择了我在原始问题中概述的实现,它似乎运行良好。以下是重试逻辑的示例实现,该实现是从ItemAlreadyUpdatedOnServerException
异常的catch块调用的:
private void RetryWorkItemSave(WorkItem workItem)
{
//Get the non-computed dirty fields from the failed update
var dirtyFields = workItem.Fields.Cast<Field>()
.Where(w => w.IsDirty && !w.IsComputed)
.ToDictionary((f) => f.ReferenceName, (f) => f.Value);
//Sync the work item to the latest version
workItem.SyncToLatest();
//Reapply the original field changes
foreach (var field in dirtyFields)
{
if (workItem.Fields[field.Key].IsEditable)
{
workItem[field.Key] = field.Value;
}
}
workItem.Save(SaveFlags.MergeAll);
}