这是async / await的正确实现吗?

时间:2013-04-20 14:11:12

标签: c# async-await

将异步上传文件的方法:

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();

这是一种异步上传文件的有效方法吗?

2 个答案:

答案 0 :(得分:2)

嗯,它有几个问题:

  1. async void应仅用于事件处理程序。在所有其他情况下,您应该使用async Task(或async Task<T>),以便您可以异步等待,直到方法完成并正确处理执行期间发生的任何错误。
  2. 您的方法只包含同步UploadFile()方法。如果存在异步替代(UploadFileAsync()),那么您应该使用它。
  3. 您可以通过不使用await来提高效率,而是直接返回Task(或StartNew())获得的UploadFileAsync()

答案 1 :(得分: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();

另外我知道返回void的异步方法不是好习惯,最好还是返回Task /