This is an example of how to do multiple upload and download operation and to report status.
var sftp = new SftpClient("1.1.1.1", 22, "username", "password"); sftp.Connect(); var mem = File.OpenRead("D:\\TestFile0.bin"); var mem1 = File.OpenRead("D:\\TestFile1.bin"); var mem2 = File.OpenRead("D:\\TestFile2.bin"); var mem3 = File.OpenRead("D:\\TestFile3.bin"); var mem4 = File.OpenRead("D:\\TestFile4.bin"); var asynch = sftp.BeginUploadFile("/home/oleg/test1.txt", mem, null, null); var asynch1 = sftp.BeginUploadFile("/home/oleg/test2.txt", mem1, null, null); var asynch2 = sftp.BeginUploadFile("/home/oleg/test3.txt", mem2, null, null); var asynch3 = sftp.BeginUploadFile("/home/oleg/test4.txt", mem3, null, null); var asynch4 = sftp.BeginUploadFile("/home/oleg/test5.txt", mem4, null, null); var sftpASynch = asynch as SftpAsyncResult; var sftpASynch1 = asynch1 as SftpAsyncResult; var sftpASynch2 = asynch2 as SftpAsyncResult; var sftpASynch3 = asynch3 as SftpAsyncResult; var sftpASynch4 = asynch4 as SftpAsyncResult; while (!sftpASynch.IsCompleted && !sftpASynch1.IsCompleted && !sftpASynch2.IsCompleted && !sftpASynch3.IsCompleted && !sftpASynch4.IsCompleted) { Console.Write(string.Format("\rUploaded {0:#########} KB Uploaded {1:#########} KB Uploaded {2:#########} KB Uploaded {3:#########} KB Uploaded {4:#########} KB", (sftpASynch.UploadedBytes / 1024), (sftpASynch1.UploadedBytes / 1024), (sftpASynch2.UploadedBytes / 1024), (sftpASynch3.UploadedBytes / 1024), (sftpASynch4.UploadedBytes / 1024))); Thread.Sleep(100); } sftp.EndUploadFile(asynch); sftp.EndUploadFile(asynch1); sftp.EndUploadFile(asynch2); sftp.EndUploadFile(asynch3); sftp.EndUploadFile(asynch4); mem = File.Create("D:\\TestFile0_out.bin"); mem1 = File.Create("D:\\TestFile1_out.bin"); mem2 = File.Create("D:\\TestFile2_out.bin"); mem3 = File.Create("D:\\TestFile3_out.bin"); mem4 = File.Create("D:\\TestFile4_out.bin"); asynch = sftp.BeginDownload("/home/oleg/test1.txt", mem, null, null); asynch1 = sftp.BeginDownload("/home/oleg/test2.txt", mem1, null, null); asynch2 = sftp.BeginDownload("/home/oleg/test3.txt", mem2, null, null); asynch3 = sftp.BeginDownload("/home/oleg/test4.txt", mem3, null, null); asynch4 = sftp.BeginDownload("/home/oleg/test5.txt", mem4, null, null); sftpASynch = asynch as SftpAsyncResult; sftpASynch1 = asynch1 as SftpAsyncResult; sftpASynch2 = asynch2 as SftpAsyncResult; sftpASynch3 = asynch3 as SftpAsyncResult; sftpASynch4 = asynch4 as SftpAsyncResult; Console.WriteLine("Downloading"); while (!sftpASynch.IsCompleted && !sftpASynch1.IsCompleted && !sftpASynch2.IsCompleted && !sftpASynch3.IsCompleted && !sftpASynch4.IsCompleted) { Console.Write(string.Format("\rDownloaded {0:#########} MB Downloaded {1:#########} MB Downloaded {2:#########} MB Downloaded {3:#########} MB Downloaded {4:#########} MB", (sftpASynch.DownloadedBytes / 1024), (sftpASynch1.DownloadedBytes / 1024), (sftpASynch2.DownloadedBytes / 1024), (sftpASynch3.DownloadedBytes / 1024), (sftpASynch4.DownloadedBytes / 1024))); Thread.Sleep(100); } sftp.EndDownload(asynch); sftp.EndDownload(asynch1); sftp.EndDownload(asynch2); sftp.EndDownload(asynch3); sftp.EndDownload(asynch4); mem.Close(); mem1.Close(); mem2.Close(); mem3.Close(); mem4.Close();