这是我目前正在做的事情:
protected void setupProject()
{
bool lbDone = false;
int liCount = 0;
while (!lbDone && liCount < pMaxRetries)
{
try
{
pProject.ProjectItems.Item("Class1.cs").Delete();
lbDone = true;
}
catch (System.Runtime.InteropServices.COMException loE)
{
liCount++;
if ((uint)loE.ErrorCode == 0x80010001)
{
// RPC_E_CALL_REJECTED - sleep half sec then try again
System.Threading.Thread.Sleep(pDelayBetweenRetry);
}
}
}
}
现在,我可以在大多数对EnvDTE内容的调用中使用try catch块,并且效果很好。我遇到的问题是当我遍历一个集合并对每个项目执行一次操作时。
foreach(ProjectItem pi in pProject.ProjectItems)
{
// do something to pi
}
有时我在
foreach(ProjectItem pi in pProject.ProjectItems)
行中得到了异常。因为如果我收到RPC_E_CALL_REJECTED异常,我不想启动foreach循环,所以我不确定该怎么办。
编辑以回答评论:
是的,我正在从另一个程序中自动执行VS,是的,我通常同时将VS用于其他用途。我们有一个应用程序,该应用程序读取一个xml文件,然后基于该xml文件生成大约50个VS解决方案。这通常需要几个小时,因此在发生这种情况时,我会尝试做其他工作。
最佳答案
首先,汉斯不想这么说,但是“如何做到这一点”的最佳答案是“不要这样做”。尽可能使用单独的Visual Studio实例进行自动化和其他工作。
您需要将问题陈述带到可以处理错误的地方。您可以通过使用整数索引而不是foreach来实现。
// You might also need try/catch for this!
int cProjectItems = pProject.ProjectItems.Length;
for(iProjectItem = 0; iProjectItem < cProjectItems; iProjectItem++)
{
bool bSucceeded = false;
while(!bSucceeded)
{
try{
ProjectItem pi = pProject.ProjectItems[iProjectItem];
// do something with pi
bSucceeded = true;
}catch (System.Runtime.InteropServices.COMException loE)
{
liCount++;
if ((uint)loE.ErrorCode == 0x80010001) {
// RPC_E_CALL_REJECTED - sleep half sec then try again
System.Threading.Thread.Sleep(pDelayBetweenRetry);
}
}
}
}
关于c# - 在执行Visual Studio自动化时,是否有更好的方法来处理RPC_E_CALL_REJECTED异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5330289/