Question

Je suis en train d'écrire un Récepteur d'Événement sur une Bibliothèque de documents pour créer une nouvelle liste à partir de la téléchargé le fichier excel.il fonctionne sur ItemAdded() et ItemUpdated() de l'événement.

Avant d'appeler une méthode pour ajouter de nouveaux Éléments à la Liste, j'ai besoin d'effacer les anciens Articles, j'ai d'abord essayé avec la méthode traditionnelle (itération dans l'ordre décroissant, et supprimer tous les enregistrements) et maintenant avec la ProcessBatchData

 using (SPSite site = new SPSite(properties.WebUrl))
                        {
                            if (site.OpenWeb().Lists[listName].Items.Count > 0)
                            {
                                var deleteBatch = site.OpenWeb().ProcessBatchData(BuildBatchDeleteCommand(site.OpenWeb().Lists[listName]));
                            }
                            InsertIntoList(ExcelRecords, site.OpenWeb().Lists[listName].Items);
                        }

ProcessBatachData est-ce mieux, mais pas encore précis, le problème est que, bien que debuggin une fois que le contrôle atteint la ligne var deleteBatch = site.OpenWeb().ProcessBatchData(BuildBatchDeleteCommand(site.OpenWeb().Lists[listName]));

Il prend le contrôle de retour pour le téléchargement des documents de l'écran et la plupart du temps ne frappe pas le reste du code, Cependant si les enregistrements sont vraiment bas ( < 100), alors ce processus et prend le contrôle à la ligne suivante ( InsertIntoList(ExcelRecords, site.OpenWeb().Lists[listName].Items); ).

Pas en mesure de déterminer si un thread en question, Si je fais ce travail mon putting fil de dormir pendant un certain temps jusqu'à ce que le ProcessBatch termine son travail de contrôle et de passer à la prochaine ligne.

La fonction complète ressemble

 public override void ItemUpdated(SPItemEventProperties properties)
        {
            UpdateMarketingCalendar(properties);
            base.ItemUpdated(properties);
        }


private void UpdateMarketingCalendar(SPItemEventProperties properties)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate
            {
                try
                {
                    using (SPSite site = new SPSite(properties.WebUrl))
                    {
                        SPList list = site.OpenWeb().Lists[listName];

                        bool recordsRetrieved;
                        DataTable ExcelRecords = GetRecordsFromExcel(properties.ListItem, out recordsRetrieved);

                        if (recordsRetrieved)
                        {
                            if (list.ItemCount > 0)
                            {
                                var deleteBatch = site.OpenWeb().ProcessBatchData(BuildBatchDeleteCommand(list));
                            }
                            InsertIntoList(ExcelRecords, list.Items);
                        }
                    }
                }

            });
        }

Les Geeks merci de m'indiquer la bonne direction.J'apprécie vraiment vous aider et de temps.

Vishal

Était-ce utile?

La solution

Ce n'est probablement pas la cause de vos problèmes de performance, mais une partie d'elle.Votre code est écrit dans un moyen inefficace, l'ouverture de sites web à droite et à gauche et de la recherche de la liste à de multiples reprises.Quelque chose comme cela fait la même chose mais de manière plus efficace:

Si votre fonction est web étendue:

    var web = properties.Feature.Parent as SPWeb;

si le site l'étendue

    var site = properties.Feature.Parent as SPSite;
    if(site == null) return;
    var web = site.OpenWeb(properties.WebUrl);

et comme MdMazzotti souligné vous réellement besoin de jeter le web dans ce scénario, je voudrais utiliser l'instruction d'utilisation, remplacer la dernière ligne par:

using(var web = site.OpenWeb(properties.WebUrl)){

et ajouter un supplément de } à la fin de la suivante :

    if(web == null || !web.Exists) return;

    var list = web.Lists[listName]
    if (list != null && list.Items.Count > 0)
    {
        var deleteBatch = web.ProcessBatchData(BuildBatchDeleteCommand(list));
    }

    InsertIntoList(ExcelRecords, list.Items);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top