在XAML构建期间修改了Collection的异常 [英] Getting Collection was modified Exception during XAML build

查看:68
本文介绍了在XAML构建期间修改了Collection的异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,


我知道这与旧的构建系统有关,但我的公司刚刚将TFS升级到2017年,我们现在仍在使用XAML版本。



我们有一个继承自AsyncCodeActivityContext类的自定义活动。此活动侦听另一个构建状态,并将数据写入构建日志。我按照建议这样做:

 Dim current As IActivityTracking = _context.GetExtension(Of IBuildLoggingExtension)()。GetActivityTracking(Me._context)
_bs = current.Node.Children.AddBuildStep(" STEP"," Check Parent Build")
_bs.Status = BuildStepStatus.Unknown
_bs.Save()


   

通常,一切都还可以,但有时我会遇到这个令人讨厌的例外:



异常消息:集合已被修改;枚举操作可能无法执行。 (输入InvalidOperationException)

异常堆栈跟踪:    at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()

    at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.CopyDictionary(Dictionary`2 dictionary)

    at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)

    at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)

    at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)

    at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)

    at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)

    at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)

    at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)

    at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)

    at Microsoft.TeamFoundation.Build.Client.BuildInformation.Save()

    at Microsoft.TeamFoundation.Build.Workflow.Tracking.BuildTrackingParticipant.GetActivityTracking(ActivityContext context)

    at NG.CustomActivities.CheckParentBuildStatusActivity.BeginExecute(AsyncCodeActivityContext context,AsyncCallback callback,Object state)

    at System.Activities.AsyncCodeActivity.InternalExecute(ActivityInstance instance,ActivityExecutor executor,BookmarkManager bookmarkManager)

    at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor,BookmarkManager bookmarkManager,Location resultLocation)



根据堆栈跟踪,当我尝试获取构建日志对象时发生此异常:

 Dim current As IActivityTracking = _context.GetExtension(Of IBuildLoggingExtension)()。GetActivityTracking(Me._context)

我想这是因为这是AsyncCodeActivityContext(在Async上强调),我还有其他活动正在运行并行更新日志...
$


我的问题是,当其他活动可能并行运行时,获取和写入构建日志的最佳方法是什么


10x !!


Roy









RR

解决方案

嗨罗伊,


你能不能同步运行?


您可以尝试锁定资源:
SyncLock语句


问候


Starain


Hello all,

I know this is related to the old build system but my company just upgraded the TFS to 2017 and we're still using XAML builds for now.

We have a custom activity that inherits from AsyncCodeActivityContext class. This activity listens for another build status and writes data to the build log. I do it as suggested:

Dim current As IActivityTracking = _context.GetExtension(Of IBuildLoggingExtension)().GetActivityTracking(Me._context)
_bs = current.Node.Children.AddBuildStep("STEP", "Check Parent Build")
_bs.Status = BuildStepStatus.Unknown
_bs.Save()

   

Usually, everything is OK but sometimes I get this nasty exception:

Exception Message: Collection was modified; enumeration operation may not execute. (type InvalidOperationException)
Exception Stack Trace:    at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
   at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.CopyDictionary(Dictionary`2 dictionary)
   at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)
   at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)
   at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)
   at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)
   at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)
   at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)
   at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)
   at Microsoft.TeamFoundation.Build.Client.BuildInformationNode.GetRequests(Boolean getUnsavedParentNodes)
   at Microsoft.TeamFoundation.Build.Client.BuildInformation.Save()
   at Microsoft.TeamFoundation.Build.Workflow.Tracking.BuildTrackingParticipant.GetActivityTracking(ActivityContext context)
   at NG.CustomActivities.CheckParentBuildStatusActivity.BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, Object state)
   at System.Activities.AsyncCodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)
   at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)

according to the stack trace, this exception happens when I try to get the build log object:

Dim current As IActivityTracking = _context.GetExtension(Of IBuildLoggingExtension)().GetActivityTracking(Me._context)

I guess it happens because this is a AsyncCodeActivityContext (emphasized on Async) and I have other activities running and updating the log in parallel...

My question is what is the best way to get and write to the build log when other activities might be running in parallel

10x!!

Roy


R.R

解决方案

Hi Roy,

Could you run it in synchronization?

You may try it to lock resource: SyncLock Statement.

Regards

Starain


这篇关于在XAML构建期间修改了Collection的异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆