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

本文关键字:实现 async await 这是 | 更新日期: 2023-09-27 18:10:12

异步上传文件的方法:

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

这是一个有效的方法来上传文件异步?

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

它有几个问题:

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

可以,但是为什么要在方法

中使用await呢?
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/