簡體   English   中英

完成一個異步調用后,將響應返回給調用方

[英]Return response to caller when one of the async call is done

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM