With the Task-based asynchronous API, just call the async variants of your method as many times as you wish (in my example, I only have two tasks and I used GetFileAsync instead of UploadAsync method, but the same approach can be used universally), and then save the tasks into a field like this:
Sftp sftp = new Sftp();
Task tasks = new Task;
tasks = sftp.GetFileAsync("file.txt", @"c:\file.txt");
tasks = sftp.GetFileAsync("file2.txt", @"c:\file2.txt");
Then use the Task.WaitAll method and then disconnect. However, the WaitAll method is "blocking" and it stops the execution of the program until all tasks are finished:
Or you can take advantage of the Task.Factory.ContinueWhenAll which can be a better choice, cause it is not blocking, the disconnect will be executed once all tasks are finished.
var continuation = Task.Factory.ContinueWhenAll(