Processing files retrieved through FTP in parallel
Exception order changes processing

This looks really odd to me:

catch (AggregateException ae)
{
    foreach (var ex in ae.InnerExceptions)
    {
        if (ex is ArgumentException)
            Console.WriteLine(ex.Message);
        else
            throw ex;
    }
}


It's basically saying write ArgumentExceptions to the Console, but only until you find an error that isn't an ArgumentException.  Then throw that exception.

I don't like it firstly because it could have different results based on order that the exceptions have been added to the queue and secondly because it discards any exceptions after the first one.

Exceptions for program flow

Having ProcessFiles which is a private method return void and throw an aggregate exception, which is immediately caught in the public caller, feels wrong to me.  You've already collected the exceptions into a queue, why not just have the method return the queue?  The caller can then decide what to do based on the collection being empty or not.