SharePoint 2010中的"foreach"

3
我有两个SharePoint列表,需要将List1中的所有项目复制到List2中。
在List1中有一个布尔字段(默认为“否”),一个文本字段和一个关联的工作流,该工作流在修改时触发。
工作流简化:
1. 将当前项目复制到List2 2. 将我的布尔字段设置为“是” 3. 搜索一个布尔字段为“否”的项目,并将其文本字段设置为“copy”
我通过修改List1中的项目来启动此过程,然后它将自行复制到List2中,修改另一个项目,如此往复...直到任何一个具有布尔字段设置为“否”的项目。
这对于10个项目完美地运行,但是之后就失败了。第10项将第11项的文本字段修改为“copy”,但第11项的工作流未启动。我已经尝试了几次,总是在复制10次后停止。
我已经搜索了Google和MSDN。我找到的最佳解决方案是在工作流中暂停1分钟。但我有数千个项目...
有人有什么建议吗?我甚至找不到在SharePoint 2010服务器中默认为10的限制。
谢谢!

确实非常奇怪 - 我也不知道10左右有任何限制。这与分页有关吗?但是工作流通常不关心分页。 - Dennis G
2
我认为默认情况下有一个并发工作流限制,可能是8或15。我现在没有SP2010,但我认为它在Central Admin > Web Application Management > 选择您的Web应用程序 > 资源/节流/限制/无论它叫什么中。请参阅此处以获取更多信息:http://stackoverflow.com/questions/6332070/active-vs-running-workflow - 我不确定它是否适用,但我认为限流正在影响您。还要检查ULS日志文件(14\LOGS)以获取有关工作流限制的信息。 - Michael Stum
当您需要完成像将项目从一个列表复制到另一个列表这样简单的任务时,请忘记工作流程。您正在滥用一个不应该替代“普通for循环”的机制。无论错误的来源是什么。 - Ondrej Tucny
3个回答

0

您可以使用CAML批处理方法。

类似于这样:

    void UpdateList()
    {
        StringBuilder methodBuilder = new StringBuilder();
        string batch = string.Empty;
        string newValue="mmmm";
        string updateColumn = "SampleColumn";


        try
        {
            string batchFormat =    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                                    "<ows:Batch OnError=\"Continue\">{0}</ows:Batch>";
            string methodFormat = "<Method ID='{0}' >" +
                                    "<SetList>{1}</SetList>" +
                                    "<SetVar Name='Cmd'>Save</SetVar>" +
                                    "<SetVar Name='ID'>{2}</SetVar>" +
                                    "<SetVar Name='urn:schemas-microsoft-com:office:office#{3}'>{4}</SetVar>" +
                                    "</Method>";

            using (SPSite siteCol = new SPSite("SampleSite"))
            {
                using (SPWeb web = siteCol.OpenWeb())
                {

                    // Get the list containing the items to update
                    SPList list = web.Lists["SampleList"];
                    string listGuid = list.ID.ToString();
                    SPListItemCollection allItems = list.GetItems();

                    // Build the CAML update commands.
                    for (int i = 0; i < allItems.Count; i++)
                    {
                        int itemID = allItems[i].ID;
                        methodBuilder.AppendFormat(methodFormat, itemID, listGuid, itemID, updatedColumn, newValue);
                    }
                    web.AllowUnsafeUpdates = true;

                    // Generate the CAML
                    batch = string.Format(batchFormat, methodBuilder.ToString());

                    // Process the batch 
                    string batchReturn = web.ProcessBatchData(batch);

                }
                //done
            }

        }
        catch (Exception ex)
        {
    //show the error
        }

    }

您可以为列表和文档库创建批处理方法,用于创建、删除和更新项目。

参考资料:

http://msdn.microsoft.com/en-us/library/office/ms437562%28v=office.15%29.aspx

http://msdn.microsoft.com/en-us/library/office/ms459050(v=office.15).aspx


0
如果你想要更改工作流的并发执行限制......
检查限制的方法是:
 Get-SPFarmConfig | Select WorkflowPostponeThreshold 

关于更改

 Set-SPFarmConfig -WorkflowPostponeThreshold 50 

计时器服务按批大小处理项(工作流程续集)。
 Get-SPFarmConfig | Select WorkflowBatchSize 

 Set-SPFarmConfig -WorkflowBatchSize 150 

0

由于工作流速度过快,您正在触发SharePoint 2010中的硬编码资源限制。这是为了防止系统在工作流操作期间变得无响应而设置的。在应用程序页面或计时器作业中的代码可以避开此限制,但不建议进行贪婪操作,以使系统对用户变得无响应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接