【问题标题】:Handle image after download下载后处理图片
【发布时间】:2021-08-26 20:34:23
【问题描述】:

我正在使用 CopyToAsync 将图像下载到本地服务器。下载后,我必须使用 FluentFTP 将文件上传到另一个网络服务器。

我下载图片的代码是:

public static async Task DownloadImage(Entity.LoginResult loginResult, string saveFolder, string image, string saveFile)
    {
        string filename = System.IO.Path.GetFileNameWithoutExtension(saveFile);
        string extension = System.IO.Path.GetExtension(saveFile);
        {
            saveFile = GetValidUrlString(filename, "-", 255) + extension;
            using (var httpClient = new HttpClient())
            {
                using (var request = new HttpRequestMessage(new HttpMethod("GET"), apiUrl + image + "/download"))
                {
                    request.Headers.TryAddWithoutValidation("Authorization", "CBX-SIMPLE-TOKEN Token=" + loginResult.token);
                    var response = httpClient.SendAsync(request).Result;
                    if (response.StatusCode == System.Net.HttpStatusCode.OK)
                    {
                        using (var fs = new FileStream(saveFolder + saveFile, FileMode.Create))
                        {                                
                            await response.Content.CopyToAsync(fs);
                        }
                    }
                }
            }
        }
    }

调用 DownloadImage 后,我想检查文件是否已下载,如下所示:

if (System.IO.File.Exists(saveFolder + media.filename))
{ Call ftp  }

在 ftp 传输图像时出现以下错误

  1. 图像未下载(System.IO.File.Exist = False)
  2. 映像正在处理中,由于文件正在使用,FTP 失败。

谁能告诉我如何使用 async/await 以便下载和上传都完成

【问题讨论】:

  • response.StatusCode 的值是多少?
  • 只有在 System.Net.HttpStatusCode.OK (if (response.StatusCode == System.Net.HttpStatusCode.OK)) 时才会进展
  • 您似乎没有在等待此任务。为什么不让DownloadImage 至少返回一个bool 值,以表明它成功或失败(因此,将返回类型更改为Task<bool>)。 -- 你从哪里调用这个方法?您可以发布该代码吗? -- 这是什么类型的应用程序?
  • 继@Jimi 的评论之后,您应该这样做var response = await httpClient.SendAsync(request);

标签: c# asynchronous async-await


【解决方案1】:
  1. 换行var response = httpClient.SendAsync(request).Result;
    var response = await httpClient.SendAsync(request); 在我目前工作的公司中,.Result 在类似的任务中不起作用 有时是正确的。

  2. 如果下载失败,抛出。

    如果 (response.StatusCode != System.Net.HttpStatusCode.OK) { 抛出新异常(“下载失败”)。 }

  3. 为确保下载成功,您需要像这样使用 await 调用它
    await DownloadImage(params)

  4. 良好的做法是“一次异步,全部异步”。这意味着当您使用一个异步时,您的所有代码都应该是异步的。

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多