在进行visual studio自动化时,是否有更好的方法来处理RPC_E_CALL_REJECTED异常?

sco*_*ott 5 c# code-generation visual-studio-2010

这就是我目前正在做的事情:

    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);
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在我尝试阻止大多数调用EnvDTE的东西,它运行得很好.我遇到的问题是当我遍历一个集合并对每个项目执行一次操作时.

foreach(ProjectItem pi in pProject.ProjectItems)
{
    // do something to pi
}
Run Code Online (Sandbox Code Playgroud)

有时我会foreach(ProjectItem pi in pProject.ProjectItems)在行中获得异常.因为如果我得到RPC_E_CALL_REJECTED异常,我不想启动foreach循环,我不知道我能做什么.

编辑回答评论:是的我正在从另一个程序自动化VS,是的,我通常在同时使用VS做其他事情.我们有一个应用程序读取xml文件,然后根据xml文件生成大约50个VS解决方案.这通常需要几个小时,所以当我发生这种情况时,我会尝试做其他工作.

Ben*_*Ben 1

首先,汉斯不想这么说,但“如何做到这一点”的最佳答案是“不要这样做”。如果可能的话,只需使用 Visual Studio 的单独实例来进行自动化和其他工作。

您需要将问题陈述放在可以处理错误的地方。您可以通过使用 in 整数索引而不是 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);
            }
        }  
   }

}
Run Code Online (Sandbox Code Playgroud)