Многопоточное программирование - путь в этом случае.
Вы можете создать делегата для функции, которая будет загружать файл и использовать BeginInvoke для выполнения функции в отдельном потоке.
Или вы можете просто создать новый поток, используя класс Thread и встроенный .net ThreadPool.