完成一个异步调用后,将响应返回给调用方

时间:2019-01-28 20:06:10

标签: c# .net asynchronous

我需要使用.net api.asps.net Core Web api将文件保存在两个不同的服务器中。在任何服务器中成功保存文件后,我想将响应返回给调用方。可以使用异步编程来实现吗?我们可以从api返回响应并将其保存在其他位置吗?

现在我正在使用并行选项:

   var imageName = $"{Guid.NewGuid().ToString()}.{extension}";

        var locations = new ConcurrentDictionary<string, string>();

        Parallel.ForEach(destinationFolders, folder =>
        {

            try
            {
                var fullName = $@"{folder.Value}\{imageName}";

                if (!Directory.Exists(folder.Value))
                    Directory.CreateDirectory(folder.Value);

                var bytes = Convert.FromBase64String(content);
                using (var imageFile = new FileStream(fullName, FileMode.Create))
                {
                    imageFile.Write(bytes, 0, bytes.Length);
                    imageFile.Flush();
                }

                locations.TryAdd(folder.Key, Regex.Replace(folder.Value, @"\\", @"\"));

            }

            catch (Exception ex)
            {
                Logging.Log.Error($"{Constants.ExceptionOccurred} : {ex.Message} against {folder.Key} Value : {Regex.Replace(folder.Value, @"\\", @"\")}");

            }
        });

但是,这里的问题是我要等待它完成两个位置的保存并返回响应。

1 个答案:

答案 0 :(得分:2)

您似乎不需要“任务并行”。考虑以下真正异步的方法。另外请注意,您只需执行一次Base64解码即可。

public Task WriteFiles(IEnumerable<string> destinationFolders, string content)
{
    byte[] bytes = Convert.FromBase64String(content);
    IList<Task> tasks = new List<Task>();

    foreach (var folder in destinationFolders)
    {
        // <snipped>

        Func<Task> taskFactory = async () =>
        {
            using (var imageFile = new FileStream(fullName, FileMode.Create))
            {
                await imageFile.WriteAsync(bytes, 0, bytes.Length);
                await imageFile.FlushAsync();
            }
        };

        tasks.Add(taskFactory());

        // <snipped>
    }

    return Task.WhenAny(tasks);
}