Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当一个异步调用完成时,将响应返回给调用方_C#_.net_Asynchronous - Fatal编程技术网

C# 当一个异步调用完成时,将响应返回给调用方

C# 当一个异步调用完成时,将响应返回给调用方,c#,.net,asynchronous,C#,.net,Asynchronous,我需要使用.NETAPI将文件保存在两个不同的服务器上。它的asp.NETCoreWebAPI。当成功将文件保存到任何服务器中时,我希望将响应返回给调用方。这可以通过异步编程实现吗?我们可以从api返回响应并让它保存在其他位置吗 目前,我使用的是并行选项: var imageName = $"{Guid.NewGuid().ToString()}.{extension}"; var locations = new ConcurrentDictionary<strin

我需要使用.NETAPI将文件保存在两个不同的服务器上。它的asp.NETCoreWebAPI。当成功将文件保存到任何服务器中时,我希望将响应返回给调用方。这可以通过异步编程实现吗?我们可以从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, @"\\", @"\")}");

            }
        });
var-imageName=$“{Guid.NewGuid().ToString()}.{extension}”;
var位置=新的ConcurrentDictionary();
Parallel.ForEach(destinationFolders,folder=>
{
尝试
{
var fullName=$@“{folder.Value}\{imageName}”;
如果(!Directory.Exists(folder.Value))
Directory.CreateDirectory(folder.Value);
var bytes=Convert.FromBase64String(内容);
使用(var imageFile=newfilestream(全名,FileMode.Create))
{
imageFile.Write(字节,0,字节.长度);
Flush();
}
locations.TryAdd(folder.Key,Regex.Replace(folder.Value,@“\\”,@“\”);
}
捕获(例外情况除外)
{
Logging.Log.Error($“{Constants.ExceptionOccurred}:{ex.Message}对{folder.Key}值:{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);
}
public Task writefile(IEnumerable destinationFolders,字符串内容)
{
byte[]bytes=Convert.FromBase64String(内容);
IList tasks=新列表();
foreach(destinationFolders中的var文件夹)
{
// 
Func taskFactory=async()=>
{
使用(var imageFile=newfilestream(全名,FileMode.Create))
{
等待imageFile.WriteAsync(字节,0,字节.长度);
等待imageFile.FlushAsync();
}
};
tasks.Add(taskFactory());
// 
}
返回任务。何时返回(任务);
}

您正在搜索什么?@5ar:当将文件保存到第二个服务器/位置失败时,我还需要做一些后期处理。是的,我在任务线上看起来很像。等等。如果你能给我提供一些关于这个的教程/分步指南,我将不胜感激。这是什么样的应用程序?你需要向我们提供更多的细节。它的asp.net核心web api。非常感谢你,是的,它看起来非常整洁!!但是,如果后面的任务(未完成的任务)失败,我还有另一件事要做,那么我需要做一些后期处理。我该如何捕获它?我是指第二次保存时的响应。这里的“失败”是指:无法在文件服务器上保存