Возврат ответа вызывающей стороне, когда один из асинхронных вызовов выполнен - PullRequest
0 голосов
/ 28 января 2019

Мне нужно сохранить файл на двух разных серверах, используя .net api.Its asp.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 голосов
/ 29 января 2019

Похоже, вам не нужно параллельное выполнение задач для этого.Рассмотрим следующий действительно асинхронный подход.Также обратите внимание, что вам нужно выполнить декодирование 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...