2013-04-20 2 views
0

метод, который будет загружать файл асинхронно:Является ли это правильной реализацией async/wait?

public async void UploadScreenshot(DateTime? date = null) 
{ 
    var uploadTask = Task.Factory.StartNew(() => _ftp.UploadFile(_screenshotLocalFile, 
                   date.HasValue 
      ? _screenshotRemoteFile.Replace("{1}", date.Value.ToString(Helper.StandardTimeFile)) 
      : _screenshotRemoteFile.Replace("{1}", DateTime.Now.ToString(Helper.StandardTimeFile)))); 
    await uploadTask; 
} 

Использование:

UploadScreenshot(); 

Является ли это достоверный метод для загрузки файла асинхронно?

+0

зависит от вашего определения. В этом контексте await/async ничего не дает. Как только вы выберете UploadScreenShot(), будет выполнен другой поток, и ваш код не будет ждать завершения загрузки, чтобы на самом деле ждать, вам нужно вернуть Task. –

ответ

1

Да, но почему, чтобы ждать внутри метода

public Task UploadScreenshot(DateTime? Date = null) 
{ 
    var uploadTask = Task.Factory.StartNew(() => 
     _ftp.UploadFile(_screenshotLocalFile, date.HasValue 
       ? _screenshotRemoteFile.Replace("{1}", date.Value.ToString(Helper.StandardTimeFile)) 
       : _screenshotRemoteFile.Replace("{1}", DateTime.Now.ToString(Helper.StandardTimeFile)))); 

    return uploadTask; 
} 

Использование:

await UploadScreenshot(); 

Кроме того, как я знаю, что асинхронная методу возвращение пустоты не является хорошей практикой, лучше вернуться Task/

+0

В чем разница между 'Task' и' Task '? –

+0

Задача - где T означает тип свойства результата в возвращенной задаче. Вам не нужно возвращать задачу , потому что Task.Factory.StartNew уже возвращает экземпляр задачи. И я ожидаю, что возвращаемая задача может привести к некоторым проблемам в цепочке задач. – Regfor

2

Ну, у него было несколько вопросов:

  1. async void следует использовать только для обработчиков событий. Во всех остальных случаях вы должны использовать async Task (или async Task<T>), чтобы вы могли асинхронно ждать, пока метод не завершится и не обработает какие-либо ошибки, которые происходят во время его выполнения.
  2. Ваш метод просто обертывает синхронный метод UploadFile(). Если есть асинхронная альтернатива (UploadFileAsync()), вы должны использовать это вместо этого.
  3. Вы можете сделать это более эффективным, не используя await и вместо этого непосредственно возвращая Task, вы получаете от StartNew() (или UploadFileAsync()).
Смежные вопросы