VAAA
VAAA

Reputation: 15039

Task continue with multiple tasks

I have a method that uploads one file to server. Right now is working besides any bad coding on the method (Im new to Task library).

Here is the code that uploads a file to server:

private async void UploadDocument()

{
    var someTask = await Task.Run<bool>(() =>
    {
        // open input stream
        using (System.IO.FileStream stream = new System.IO.FileStream(_cloudDocuments[0].FullName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
        {
            using (StreamWithProgress uploadStreamWithProgress = new StreamWithProgress(stream))
            {
                uploadStreamWithProgress.ProgressChanged += uploadStreamWithProgress_ProgressChanged;

                // start service client
                SiiaSoft.Data.FieTransferWCF ws = new Data.FieTransferWCF();

                // upload file
                ws.UploadFile(_cloudDocuments[0].FileName, (long)_cloudDocuments[0].Size, uploadStreamWithProgress);

                // close service client
                ws.Close();
            }
        }

        return true;

    });

}

Then I have a ListBox where I can drag & drop multiple files so what I want to do is to do a FOR LOOP within the ListBox files and then call UploadDocument(); but I want to first upload 1st file in the listBox then when completed continue with the second file and so on...

Any clue on the best way to do it?

Thanks a lot.

Upvotes: 3

Views: 1960

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1500065

You should make your UploadDocument return Task. Then you can await the task in a loop. For example:

private async Task UploadAllDocuments()
{
    string[] documents = ...; // Fetch the document names

    foreach (string document in documents)
    {
        await UploadDocument(document);
    }
}

private async Task UploadDocument(string document)
{
    // Code as before, but use document instead of _cloudDocuments[0]
}

In fact, your UploadDocument can be made simpler anyway:

private Task UploadDocument()
{
    return Task.Run<bool>(() =>
    {
        // Code as before
    });
}

Wrapping that in an async method isn't particularly useful.

(You may well want to change the type to not be string - it's not clear what _cloudDocuments is.)

In general, you should always make an async method return Task or Task<T> unless you have to make it return void to comply with an event-handling pattern.

Upvotes: 9

Related Questions