Implementing Multi-Threading with MaxDegreeOfParallelism in SharePoint using CSOM – An Insight


Sathish Nadarajan
SharePoint MVP
Published On :   21 Nov 2016
Visit Count
Today :  3    Total :   3206
Plan, Migrate, Secure, Report
SharePoint & Office 365 Tool. Simple & Easy to Use. 15-Day Trial!

SharePoint Office 365 Tool
Simple & Powerful Tool for Migration, Security & Reporting. Free Trial


In the last article we saw how to use Multi Threading in SharePoint using CSOM. But, I felt some what we don’t have control over the thread in the last implementation. i.e., If we have 1000 files in the source and by the previous code, all the 1000 files may try to upload simultaneously. That may cause definitely an impact over the tenant. (Yes, we faced the request time out, forbidden exceptions etc., )

So, I want the batches to be splitted and then upload the files. i.e., very simple. There should be multi threading. But, I will be deciding my thread count.

 namespace Console.Office365
 {
     using Microsoft.SharePoint.Client;
     using Newtonsoft.Json.Linq;
     using System;
     using System.Collections.Generic;
     using System.IO;
     using System.Linq;
     using System.Threading.Tasks;
 
     class Program
     {
         static void Main(string[] args)
         {
             UploadFilesMultiThread();
         }
 
 
 
         public static void UploadFilesMultiThread()
         {
             string[] filePaths = System.IO.Directory.GetFiles("D:\\Temp\\UploadFiles");
 
             OfficeDevPnP.Core.AuthenticationManager authMgr = new OfficeDevPnP.Core.AuthenticationManager();
 
             string siteUrl = "https://******.sharepoint.com/sites/CommunitySite/";
             string userName = "Sathish@******.onmicrosoft.com";
             string password = "**********";
 
 
 
             List<Action> actionsArray = new List<Action>();
 
             foreach (var filePath in filePaths)
             {
                 actionsArray.Add(new Action(() => UpLoadFiles(authMgr, siteUrl, userName, password, filePath)));
             }
 
 
 
 
             Action[] array = actionsArray.ToArray();
 
             System.Threading.Tasks.Parallel.Invoke(new System.Threading.Tasks.ParallelOptions { MaxDegreeOfParallelism = 2 }, array);
 
 
             System.Console.WriteLine("Process Completed");
             System.Console.ReadLine();
         }
 
         private static void UpLoadFiles(OfficeDevPnP.Core.AuthenticationManager authMgr, string siteUrl, string userName, string password, string filePath)
         {
             using (var ctx = authMgr.GetSharePointOnlineAuthenticatedContextTenant(siteUrl, userName, password))
             {
                 Web web = ctx.Web;
                 ctx.Load(web);
 
                 List list = web.Lists.GetByTitle("MyDocumentsLibrary");
                 ctx.Load(list);
                 ctx.Load(list.RootFolder);
 
                 ctx.ExecuteQueryRetry();
 
                 if (System.IO.File.Exists(filePath))
                 {
                     System.Console.ForegroundColor = ConsoleColor.Green;
                     System.Console.WriteLine("Entered into : " + Path.GetFileName(filePath));
                     
                     Folder folder = web.GetFolderByServerRelativeUrl(list.RootFolder.ServerRelativeUrl);
                     folder.UploadFile(Path.GetFileName(filePath), filePath, true);
 
                     folder.Update();
 
                     ctx.Load(folder);
                     ctx.ExecuteQueryRetry();
                 }
             }
         }
 
 
          
 
     }
 
 }
 

On the below line, the MaxDegreeOfParallelism Parameter is the one, which decides how many items in the array to be taken at a time simultaneously.

System.Threading.Tasks.Parallel.Invoke(new System.Threading.Tasks.ParallelOptions { MaxDegreeOfParallelism = 2 }, array);

Happy Coding,

Sathish Nadarajan.

SharePoint Usage Reports
Usage reports, collaboration and audit for SharePoint.
Categories

SharePoint Analytics