Recently, I was involved in creation of a tool (EXE) which needs to upload a bunch of files to SharePoint Online Site Collection. Somehow, we can relate that as a kind of Migration. From the Physical drive, I need to upload to a Document Library.
In this requirement, the performance was the most critical factor. Hence, I thought of implementing the Multi-Threading using Client Side Object Model. And thought of sharing with the Community.
The piece of code is straight forward using the namespace System.Threading.Tasks
The below sample code will upload a set of files to SharePoint Document Library in Multi Threaded approach.
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 = "*************"; var tasks = new List<Task>(); tasks.AddRange(filePaths.Select(filePath => { return Task.Factory.StartNew(() => { try { 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.Threading.Thread.Sleep(10000); 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(); } } } catch (Exception ex) { System.Console.ForegroundColor = ConsoleColor.Red; System.Console.WriteLine(ex.Message); } }, TaskCreationOptions.LongRunning); })); Task.WaitAll(tasks.ToArray()); System.Console.WriteLine("Process Completed"); System.Console.ReadLine(); } } }
Hope this helps.
Happy Coding,
Sathish Nadarajan.
Leave a comment