C# 当一个异步调用完成时,将响应返回给调用方
我需要使用.NETAPI将文件保存在两个不同的服务器上。它的asp.NETCoreWebAPI。当成功将文件保存到任何服务器中时,我希望将响应返回给调用方。这可以通过异步编程实现吗?我们可以从api返回响应并让它保存在其他位置吗 目前,我使用的是并行选项:C# 当一个异步调用完成时,将响应返回给调用方,c#,.net,asynchronous,C#,.net,Asynchronous,我需要使用.NETAPI将文件保存在两个不同的服务器上。它的asp.NETCoreWebAPI。当成功将文件保存到任何服务器中时,我希望将响应返回给调用方。这可以通过异步编程实现吗?我们可以从api返回响应并让它保存在其他位置吗 目前,我使用的是并行选项: var imageName = $"{Guid.NewGuid().ToString()}.{extension}"; var locations = new ConcurrentDictionary<strin
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。非常感谢你,是的,它看起来非常整洁!!但是,如果后面的任务(未完成的任务)失败,我还有另一件事要做,那么我需要做一些后期处理。我该如何捕获它?我是指第二次保存时的响应。这里的“失败”是指:无法在文件服务器上保存