启动后台任务并立即返回

时间:2015-09-09 17:56:59

标签: c# asynchronous async-await

我有一个名为DownloadFileAsync(url, Func<RemoteFileResponse, Task> onDownloadFinished)的方法,它执行以下操作:

  • 检查缓存,如果找到,立即返回缓存并启动后台任务以查看缓存是否需要更新
  • 如果未找到,则返回null并启动后台任务以异步下载文件
  • 下载文件后,它会回调 onDownloadFinished 处理程序。

这对我来说很脏,因为我需要在后台线程上执行下载但是我无法等待它,因为我希望能够立即返回缓存文件。问题是,如果我这样做,我将丢失任何异常上下文。

我能想到的一些选择:

  • 使用IProgress界面报告缓存的文件,然后在下载完成后报告下载的结果。
  • 将方法拆分为两个调用(一个用于获取缓存文件)另一个用于下载/更新(不是首选方式,因为我希望将接口保留为一个方法)。

想知道是否有人对我如何做到这一点有任何其他建议?

我的方法的伪代码:

Task<IFile> async DownloadFileAsync(url, Func<RemoteFileResponse, Task> onDownloadFinished)
{
   var cache = await CheckCacheAsync(url);

   // don't await this so the callee can use the cached file right away 
   // instead return the download result on the download finished callback
   DownloadUrlAndUpdateCache(url, onDownloadFinished);

   return cache
}

0 个答案:

没有答案