Я пытаюсь сохранить файл в двух разных местах.Я хочу вернуть успех клиенту, когда файл успешно сохранен в любом месте.Две задачи (t1, t2) предназначены для этого.Ниже приведены случаи, которые я определил:
В случае успешного сохранения t1 верните ответ клиенту и перейдите к t2.На более поздней стадии T2, если t2 не может сохранить файл, тогда вызовите постобработку для обработки данных t2.
Но если t1 не может сохранить успешно, тогда дождитесь окончания t2, теперь, если t2 успешно сохраняет, то данные постобработки t1,
Если и t1, и t2 не могут сохранить, верните сбой.
Короче говоря, чтобы вернуть успех, один из них должен сохранить его успешно, а если успешно спасет только один, то постобработать сбойный.,
Я запустил две задачи и жду, пока одна из них будет выполнена.Остальные могут быть легко расшифрованы с помощью кода, если вам нужно больше деталей, пожалуйста, дайте мне знать.Я копирую код из консольного приложения, а не из реального приложения.Следовательно, ответ комментируется в основном методе.
// dummy class used for returning response
public class TaskResult
{
public int status { get; set; }
}
class Program
{
static void Main(string[] args)
{
//destination folder
var desFolders = new List<string>
{
@"\\Files\00a807b3\013413a0\012216ad",
@"\\Files\00a807b3\013413a0\012216ad\IdoNotExist" // to trigger failure case, IdoNotExist => does not exist
};
//base 64 string
var content =
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==";
var t1 = Task.Run(() => WriteFile(desFolders[0], content));
var t2 = Task.Run(() => WriteFile(desFolders[1], content));
// to track if file was ever saved
bool anySuccess = false;
int result = Task.WaitAny(t1, t2);
if (result == 0)
{
var response = t1.Result;
if (response.status == 1)
{
anySuccess = true;
t2.ContinueWith(prevTask =>
{
var t2Res = prevTask.Result;
if (t2Res.status == 0) // post processing if t2 could not save file
PostProcessing("t2");
});
}
}
else if (result == 1)
{
var response = t2.Result;
if (response.status == 1)
{
anySuccess = true;
t1.ContinueWith(prevTask =>
{
var t1Res = prevTask.Result;
if (t1Res.status == 0)
PostProcessing("t1"); // post processing if t1 could not save file
});
}
}
// to check if completed task was not a success then wait for other running task
if (!anySuccess)
{
TaskResult waitedResponse = null;
if (result == 0)
{
t2.Wait(); // wait for t2 as t1 was already completed
waitedResponse = t2.Result;
if (waitedResponse.status == 1)
{
//if t2 was successful then post process t1
anySuccess = true;
t1.ContinueWith(prevTask => { PostProcessing("t1"); });
}
}
else
{
t1.Wait();
waitedResponse = t1.Result;
if (waitedResponse.status == 1)
{
//if t2 was successful then post process t1
anySuccess = true;
t2.ContinueWith(prevTask =>
{
var val = prevTask;
PostProcessing("t2");
});
}
}
}
if (!anySuccess)
{
//return failure;
}
//return success
}
private static void PostProcessing(string t)
{
Console.WriteLine( $"post processing : {t}");
Console.ReadLine();
// insert record in database
// intentionally just not to make complex no argument is recived for insertion
}
private static TaskResult WriteFile(string folder, string content)
{
var imageName = $"{Guid.NewGuid().ToString()}.jpg";
var fullName = $@"{folder}\{imageName}";
try
{
byte[] bytes = Convert.FromBase64String(content);
using (var imageFile = new FileStream(fullName, FileMode.Create))
{
imageFile.WriteAsync(bytes, 0, bytes.Length);
imageFile.FlushAsync();
}
return new TaskResult { status = 1 };
}
catch (Exception ex)
{
return new TaskResult { status = 0 };
}
}
}
Здесь метод PostProcessing никогда не вызывается, хотя я вижу, что произошла ошибка при сохранении в несуществующее местоположение.Как я могу реорганизовать этот код, чтобы он работал?