Есть ли в асинхронном C# методы catch и then?
Извините за глупый вопрос, но меня интересует есть асинхронном C# методы catch и then ? Можно сделать такой код например ?
let calc=(a, b)=>{
return new Promise((resolve, reject)=>{
let t=a+b;
if(t==10){
resolve(t);
} else{
reject(new Error(`No Number ${t}`));
}
}
)}
calc(7,8).then(re=>console.log(re)).
catch(err=>console.log(err.message));
Ответы (2 шт):
Автор решения: Aziz Umarov
→ Ссылка
Так ответ на ваш вопрос.
// Создаём таск
var task = new Task<StateObject>(() => { /* action */ });
// На случай ошибки
task.ContinueWith(t => { /* error handling */ }, context,
TaskContinuationOptions.OnlyOnFaulted);
// Успешный случай
task.ContinueWith(t => { /* on success */ }, context,
TaskContinuationOptions.OnlyOnRanToCompletion);
// Пуск
task.Start();
Но async await по современнее.
try {
var res = await calc(a,b);
Console.WriteLine(res);
} catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Автор решения: aepot
→ Ссылка
Пример плохой, потому что здесь нет асинхронных операций, но синтаксически это может выглядеть так.
Func<int, int, Task<int>> calc = async (a, b)
=> (a + b) is int t && t == 10 ? t : throw new Exception($"No, number is {t}");
try
{
int sum = await calc(7, 8);
// .then
Console.WriteLine(sum);
}
catch (Exception ex)
{
// .catch
Console.WriteLine($"{ex.Message}");
}
Вывод в консоль
No, number is 15
Более читабельный код асинхронного метода
private async Task<int> Calc(int a, int b)
{
int t = a + b;
if (t == 10) return t;
throw new Exception($"No, number is {t}");
}