Здравствуйте, Shmj, Вы писали:
S>Да, это решение не оборачивает в AggregateException. Почему же его не привели на sof? Может какие подводные камни?
никаких.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: AggregateException при вызове асинхронного из синхронного
Здравствуйте, vaa, Вы писали:
vaa>Здравствуйте, Shmj, Вы писали:
S>>Да, это решение не оборачивает в AggregateException. Почему же его не привели на sof? Может какие подводные камни? vaa>никаких.
дащовыговорите
Здравствуйте, Shmj, Вы писали:
S>Wait как раз и вызывает озвученную выше проблему:
Wait вызывается на Task поэтому и бросает AgregateExc
GetAwaiter не бросает исключения, а вот GetResult да, т.к. должен вернуть int в вашем случае.
Можно еще вот так.
using System;
using System.Threading.Tasks;
namespace ConsoleApp52
{
class Program
{
static void Main(string[] args)
{
var x = MyAsyncMethod();
if( x.Status == TaskStatus.Faulted)
{
x.Exception.Handle( e =>{
if (e is InvalidOperationException) {
throw e;
return true;
}
return false;
});
}
x.Wait();
}
static async Task<int> MyAsyncMethod()
{
Console.WriteLine("My name is Alice");
throw new InvalidOperationException();
}
}
}
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[7]: AggregateException при вызове асинхронного из синхронного
Здравствуйте, vlp, Вы писали:
S>>При await, кстати, тоже теряется исключение: https://dotnetfiddle.net/pBkZIJ vlp>в приведенном примере они теряются не из-за await
А из-за чего?
Re[8]: AggregateException при вызове асинхронного из синхронного
Здравствуйте, vaa, Вы писали:
vaa>Wait вызывается на Task поэтому и бросает AgregateExc vaa>GetAwaiter не бросает исключения, а вот GetResult да, т.к. должен вернуть int в вашем случае.
Вопрос не в этом. GetResult бросить InvalidOperationException. А Wait бросит AggregateException.
vaa>Можно еще вот так. vaa>
vaa>using System;
vaa>using System.Threading.Tasks;
vaa>namespace ConsoleApp52
vaa>{
vaa> class Program
vaa> {
vaa> static void Main(string[] args)
vaa> {
vaa> var x = MyAsyncMethod();
vaa> if( x.Status == TaskStatus.Faulted)
vaa> {
vaa> x.Exception.Handle( e =>{
vaa> if (e is InvalidOperationException) {
vaa> throw e;
vaa> return true;
vaa> }
vaa> return false;
vaa> });
vaa> }
vaa> x.Wait();
vaa> }
vaa> static async Task<int> MyAsyncMethod()
vaa> {
vaa> Console.WriteLine("My name is Alice");
vaa> throw new InvalidOperationException();
vaa> }
vaa> }
vaa>}
vaa>
Во-первых, return true; у вас лишнее — никогда не исполнится.
Во-вторых, ваш код выдаст AggregateException, если в MyAsyncMethod добавить минимальную работу: https://dotnetfiddle.net/UjRVLY
Re[9]: AggregateException при вызове асинхронного из синхронного
Но оно так же теряется и с await. А если применить конструкцию await Task.WhenAll(tasks).ContinueWith(t => t.Wait()) — то не теряется и с GetAwaiter().GetResult.
Я понятно изъясняюсь?
Re[7]: AggregateException при вызове асинхронного из синхронного
S>Вопрос не в этом. GetResult бросить InvalidOperationException. А Wait бросит AggregateException.
ну да, потому что работа GetResult либо вернуть результат либо ошибку.
S>Во-первых, return true; у вас лишнее — никогда не исполнится.
да ладно. S>Во-вторых, ваш код выдаст AggregateException, если в MyAsyncMethod добавить минимальную работу: https://dotnetfiddle.net/UjRVLY
Так проблема в чем? вы хотите построить логику на эксепшенах?
using System;
using System.Threading.Tasks;
namespace ConsoleApp52
{
class Program
{
static void Main(string[] args)
{
var x = MyAsyncMethod();
x.Exception.Handle(ex => false);
x.Wait();
}
static async Task<int> MyAsyncMethod()
{
await Task.Delay(100);
Console.WriteLine("My name is Alice");
throw new InvalidOperationException();
}
}
}
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[8]: AggregateException при вызове асинхронного из синхронного
Здравствуйте, vaa, Вы писали:
S>>Во-вторых, ваш код выдаст AggregateException, если в MyAsyncMethod добавить минимальную работу: https://dotnetfiddle.net/UjRVLY vaa>Так проблема в чем? вы хотите построить логику на эксепшенах?
В том что поведение кода не такое как ожидаете.
Re[5]: AggregateException при вызове асинхронного из синхронного
Здравствуйте, vlp, Вы писали:
vaa>>никаких. vlp>дащовыговорите
и где тут камни?
просто кривая реализация асинхронки.
Следовать гайду, не изобретать велосипед, и не ожидать чуда от технологии.
кто вообще придумал этот await?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[10]: AggregateException при вызове асинхронного из синхронного
Здравствуйте, Shmj, Вы писали:
vaa>>На чем основаны ваши ожидания?
S>Я про ожидания в вашем коде. Вы ожидаете что отловите IOE, но на самом деле возникает AE.
Выполняя Wait на объекта класса Task ожидаем:
Исключения
ObjectDisposedException
Объект Task удален.
ArgumentOutOfRangeException
timeout является отрицательным числом, отличным от -1 миллисекунды, которое представляет неограниченное время ожидания. -или- Значение timeout больше значения MaxValue.
AggregateException
Задача отменена. Коллекция InnerExceptions содержит объект TaskCanceledException.
-или- Во время выполнения задачи возникло исключение. Коллекция InnerExceptions содержит сведения об исключении или исключениях.
И да, добавляя кейворд async вы тем самым изменяете исходный код. По сути это макрос. который оборачивает тело метода в делегат.
Если это ваш код перепешите его без использования исключений.
Библиотека LanguageExt.Core может помочь.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[11]: AggregateException при вызове асинхронного из синхронного