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

高塔姆

我需要使用.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, @"\\", @"\")}");

            }
        });

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

格列尼单抗

您似乎不需要此任务并行。考虑以下真正异步的方法。另请注意,您只需执行一次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);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Apache Camel:在消耗了一个休息端点之后,将响应发送给调用者

调用另一个函数并使其直接返回到这个函数的调用者

Angular 2同步问题-完成2个异步调用后调用函数

从一定同步调用者异步方法(Vert.x,JAVA)

可以使用useEffect对一个异步调用的完成顺序进行排序吗?

C#LanguageExt-将多个异步调用合并为一个分组的调用

为什么在循环中涉及异步调用的递归函数不返回到调用者函数以继续循环?

我如何使用从on_read处理程序分派的最终回调将响应异步返回给调用者?

如何从异步调用返回响应?

如何从异步调用返回响应?

从异步调用返回响应

从异步调用示例返回响应

如何返回多个异步调用的响应?

在另一个函数中异步调用后,我一直未定义

如何申报科特林LAMBDA与一个java调用者返回类型“无效”?

我应该如何使用在一个异步调用中返回的accessToken在另一个异步调用中?

一次将 Lumen 路由中的运行代码限制给一个调用者

如何进行多个异步调用并从找到匹配记录的第一个调用返回数据,然后停止其余的异步调用

等待最后一个异步调用和只返回它之间有区别吗?

将一个整数(文字)与函数关联起来,让调用者查询 FLOP 的数量

RxJS:调用两个异步调用,返回第一个通过条件的调用,或者返回一个特殊值,它们都不执行

如何让另一个异步调用等待?

Process.Start() 一个可执行文件并返回一个 DialogResult 给调用者

异步函数调用后从工厂返回一个有角度的$ resource

尝试将数据从异步调用转移到另一个类

同步调用异步函数时被调用者的线程会发生什么

一个真正的值返回给调用者,即使出return语句指定任何返回值

如何声明与一个java调用者返回类型“无效”一科特林功能?

异步调用:在服务器收到第一个“待处理”响应后调用一个函数