Вызовы, которые вы делали в btnDownload_Click
, принципиально отличаются, что приводит к разумной ошибке во время компиляции.
- Передать делегат метода на
Task.Run
В первом случае (Task.Run((Func<Task>)Business.DownloadFileFromDropBox)
) вы передали DownloadFileFromDropBox
метод делегат методу Task.Run
, который работает, как и ожидалось, поскольку Task.Run
имеет перегрузку который принимает Func<Task>
в качестве параметра.
Так как тип делегата метода Func<Task>
, который является
в универсальном типе делегата приведение не требуется, вы можете просто передать его в метод:
Task.Run(Business.DownloadFileFromDropBox)
- Вызвать асинхронный метод и передать результат в
Task.Run
Во втором случае (Task.Run((Func<Task>)Business.DownloadFromDB("/Files", "File.txt"))
) вы фактически вызываете метод DownloadFromDB
и передаете его результат (тип Task
) в метод Task.Run
. Это, как ожидается, вызывает ошибку во время компиляции из-за несовместимости приведения типов Task
и Func<Task>
.
В заключение вам не нужно заключать Task
в другой Task
с помощью Task.Run
метода, вы можете просто напрямую вызвать Wait
для Task
объекта, возвращенного обоими методами загрузки.
var downloadFromDropBoxTask = Business.DownloadFileFromDropBox();
downloadFromDropBoxTask.Wait();
var downloadFromDBTask = Business.DownloadFromDB("/Files", "File.txt");
downloadFromDBTask.Wait()
Если вы не будете выполнять какие-либо операции (например, обработку ошибок) с вашей переменной задачи, вы можете встроить Wait
call:
Business.DownloadFileFromDropBox().Wait();
Business.DownloadFromDB("/Files", "File.txt").Wait();