Re[3]: AggregateException при вызове асинхронного из синхронного
От: vaa  
Дата: 09.12.21 04:07
Оценка: 4 (1) -1
Здравствуйте, Shmj, Вы писали:

S>Да, это решение не оборачивает в AggregateException. Почему же его не привели на sof? Может какие подводные камни?

никаких.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: AggregateException при вызове асинхронного из синхронного
От: vaa  
Дата: 10.12.21 02:21
Оценка: -1 :)
Здравствуйте, vlp, Вы писали:
vaa>>никаких.
vlp>дащовыговорите

Рукопашник демонстрирует защиту от удара кулаком.
Аплодисменты.
Подходит крутой вояка: — А если гранатой?

☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: AggregateException при вызове асинхронного из синхронного
От: Shmj Ниоткуда  
Дата: 10.12.21 01:37
Оценка: -1
Здравствуйте, vlp, Вы писали:

vlp>
vlp>Task.WhenAll(task1, task2).Wait();.
vlp>


vlp>Если task1 или task2 кинут исключение, Wait бросит AggregateException, в котором будут оба exceptionа если их 2 или 1 если он 1.


При await, кстати, тоже теряется исключение: https://dotnetfiddle.net/pBkZIJ
Re[6]: AggregateException при вызове асинхронного из синхронного
От: vlp  
Дата: 10.12.21 01:40
Оценка: +1
S>При await, кстати, тоже теряется исключение: https://dotnetfiddle.net/pBkZIJ

в приведенном примере они теряются не из-за await
Re[9]: AggregateException при вызове асинхронного из синхронного
От: vaa  
Дата: 10.12.21 02:49
Оценка: -1
Здравствуйте, Shmj, Вы писали:
vaa>>Так проблема в чем? вы хотите построить логику на эксепшенах?

S>В том что поведение кода не такое как ожидаете.

Все задокументировано https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task?view=net-6.0#WaitingForOne
На чем основаны ваши ожидания?
Думаю курс нужен всем инженерам https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
☭ ✊ В мире нет ничего, кроме движущейся материи.
AggregateException при вызове асинхронного из синхронного
От: Shmj Ниоткуда  
Дата: 09.12.21 03:15
Оценка:
Сразу код:

  Скрытый текст
using System.Threading.Tasks;

namespace ConsoleApp52
{
    class Program
    {
        static void Main(string[] args)
        {
            MyAsyncMethod().Wait();
        }

        static async Task<int> MyAsyncMethod()
        {
            throw null;
        }
    }
}


https://dotnetfiddle.net/8hyiF1

Накой черт, простите, здесь AggregateException при синхронном вызове? Для чего?

И как правильно вызывать, чтобы не оборачивало в AggregateException?
Re: AggregateException при вызове асинхронного из синхронного
От: vaa  
Дата: 09.12.21 03:22
Оценка:
Здравствуйте, Shmj, Вы писали:



S>И как правильно вызывать, чтобы не оборачивало в AggregateException?

 static async Task Main(string[] args)
        {
           _ = await MyAsyncMethod();
        }

или (до C# 7.1)
  static void Main(string[] args)
        {
                 int result = MyAsyncMethod().GetAwaiter().GetResult();
// или
             MyAsyncMethod().GetAwaiter().GetResult();
        }
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: AggregateException при вызове асинхронного из синхронного
От: Shmj Ниоткуда  
Дата: 09.12.21 04:04
Оценка:
Здравствуйте, vaa, Вы писали:

S>>И как правильно вызывать, чтобы не оборачивало в AggregateException?

vaa>
vaa> static async Task Main(string[] args)
vaa>        {
vaa>           _ = await MyAsyncMethod();
vaa>        }
vaa>


Это вызов асинхронного из асинхронного. А нужно асинхронного из синхронного.

Тут предлагают использовать что-то стороннее: https://stackoverflow.com/questions/9343594/how-to-call-asynchronous-method-from-synchronous-method-in-c

vaa>или (до C# 7.1)

vaa>
vaa>  static void Main(string[] args)
vaa>        {
vaa>                 int result = MyAsyncMethod().GetAwaiter().GetResult();
vaa>// или
vaa>             MyAsyncMethod().GetAwaiter().GetResult();
vaa>        }
vaa>


Да причем тут C# 7.1? У меня синхронный метод и переделывать в асинхронный нельзя — т.к. по контракту он должен быть синхронным.

Да, это решение не оборачивает в AggregateException. Почему же его не привели на sof? Может какие подводные камни?
Re[3]: AggregateException при вызове асинхронного из синхронного
От: vaa  
Дата: 09.12.21 04:35
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Тут предлагают использовать что-то стороннее: https://stackoverflow.com/questions/9343594/how-to-call-asynchronous-method-from-synchronous-method-in-c

думаю, лучше ориентироваться на документацию:
https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task.wait?view=net-6.0#System_Threading_Tasks_Task_Wait
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: AggregateException при вызове асинхронного из синхронного
От: Ночной Смотрящий Россия  
Дата: 09.12.21 14:12
Оценка:
Здравствуйте, Shmj, Вы писали:

S>И как правильно вызывать, чтобы не оборачивало в AggregateException?


.GetAwaiter().GetResult()
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: AggregateException при вызове асинхронного из синхронного
От: Shmj Ниоткуда  
Дата: 09.12.21 15:14
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>думаю, лучше ориентироваться на документацию:

vaa>https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task.wait?view=net-6.0#System_Threading_Tasks_Task_Wait

Wait как раз и вызывает озвученную выше проблему:

https://dotnetfiddle.net/3nwdyj
Re[2]: AggregateException при вызове асинхронного из синхронного
От: Shmj Ниоткуда  
Дата: 09.12.21 15:20
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>.GetAwaiter().GetResult()


А почему не просто Wait()? Для чего Wait добавили?
Re[4]: AggregateException при вызове асинхронного из синхронного
От: vlp  
Дата: 10.12.21 01:23
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, Shmj, Вы писали:


S>>Да, это решение не оборачивает в AggregateException. Почему же его не привели на sof? Может какие подводные камни?

vaa>никаких.
дащовыговорите

Task.WhenAll(task1, task2).GetAwaiter().GetResult();.


если task1 и task2 бросают Exception, вы потеряете один из них

Task.WhenAll(task1, task2).Wait();.


Если task1 или task2 кинут исключение, Wait бросит AggregateException, в котором будут оба exceptionа если их 2 или 1 если он 1.
Re[5]: AggregateException при вызове асинхронного из синхронного
От: vaa  
Дата: 10.12.21 01:42
Оценка:
Здравствуйте, 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 при вызове асинхронного из синхронного
От: Shmj Ниоткуда  
Дата: 10.12.21 01:48
Оценка:
Здравствуйте, vlp, Вы писали:

S>>При await, кстати, тоже теряется исключение: https://dotnetfiddle.net/pBkZIJ

vlp>в приведенном примере они теряются не из-за await

А из-за чего?
Re[8]: AggregateException при вызове асинхронного из синхронного
От: vlp  
Дата: 10.12.21 01:57
Оценка:
vlp>>в приведенном примере они теряются не из-за await

S>А из-за чего?


нет времени объяснять, держите:

await Task.WhenAll(tasks).ContinueWith(t => t.Wait());


Re[6]: AggregateException при вызове асинхронного из синхронного
От: Shmj Ниоткуда  
Дата: 10.12.21 01:58
Оценка:
Здравствуйте, 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 при вызове асинхронного из синхронного
От: Shmj Ниоткуда  
Дата: 10.12.21 02:09
Оценка:
Здравствуйте, vlp, Вы писали:

vlp>нет времени объяснять, держите:


vlp>
vlp>await Task.WhenAll(tasks).ContinueWith(t => t.Wait());
vlp>


vlp>


В таком варианте и с .GetAwaiter().GetResult() не теряется: https://dotnetfiddle.net/YjISxV

— изначально вы привели это как минус использования GetAwaiter().GetResult — теряется исключение https://rsdn.org/forum/dotnet/8150262.1
Автор: vlp
Дата: 10.12.21


Но оно так же теряется и с await. А если применить конструкцию await Task.WhenAll(tasks).ContinueWith(t => t.Wait()) — то не теряется и с GetAwaiter().GetResult.

Я понятно изъясняюсь?
Re[7]: AggregateException при вызове асинхронного из синхронного
От: vaa  
Дата: 10.12.21 02:19
Оценка:
Здравствуйте, Shmj, Вы писали:


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 при вызове асинхронного из синхронного
От: Shmj Ниоткуда  
Дата: 10.12.21 02:26
Оценка:
Здравствуйте, vaa, Вы писали:

S>>Во-вторых, ваш код выдаст AggregateException, если в MyAsyncMethod добавить минимальную работу: https://dotnetfiddle.net/UjRVLY

vaa>Так проблема в чем? вы хотите построить логику на эксепшенах?

В том что поведение кода не такое как ожидаете.
Re[5]: AggregateException при вызове асинхронного из синхронного
От: vaa  
Дата: 10.12.21 02:54
Оценка:
Здравствуйте, vlp, Вы писали:

vaa>>никаких.

vlp>дащовыговорите
и где тут камни?
просто кривая реализация асинхронки.
Следовать гайду, не изобретать велосипед, и не ожидать чуда от технологии.
кто вообще придумал этот await?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[10]: AggregateException при вызове асинхронного из синхронного
От: Shmj Ниоткуда  
Дата: 10.12.21 02:58
Оценка:
Здравствуйте, vaa, Вы писали:

S>>В том что поведение кода не такое как ожидаете.

vaa>Все задокументировано https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task?view=net-6.0#WaitingForOne
vaa>На чем основаны ваши ожидания?

Я про ожидания в вашем коде. Вы ожидаете что отловите IOE, но на самом деле возникает AE.
Re[11]: AggregateException при вызове асинхронного из синхронного
От: vaa  
Дата: 10.12.21 03:26
Оценка:
Здравствуйте, Shmj, Вы писали:

vaa>>На чем основаны ваши ожидания?


S>Я про ожидания в вашем коде. Вы ожидаете что отловите IOE, но на самом деле возникает AE.

Выполняя Wait на объекта класса Task ожидаем:

Исключения
ObjectDisposedException
Объект Task удален.

ArgumentOutOfRangeException
timeout является отрицательным числом, отличным от -1 миллисекунды, которое представляет неограниченное время ожидания. -или- Значение timeout больше значения MaxValue.

AggregateException
Задача отменена. Коллекция InnerExceptions содержит объект TaskCanceledException.

-или- Во время выполнения задачи возникло исключение. Коллекция InnerExceptions содержит сведения об исключении или исключениях.


И да, добавляя кейворд async вы тем самым изменяете исходный код. По сути это макрос. который оборачивает тело метода в делегат.
Если это ваш код перепешите его без использования исключений.
Библиотека LanguageExt.Core может помочь.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[11]: AggregateException при вызове асинхронного из синхронного
От: vaa  
Дата: 16.12.21 02:16
Оценка:
Здравствуйте, Shmj, Вы писали:


S>Я про ожидания в вашем коде. Вы ожидаете что отловите IOE, но на самом деле возникает AE.


неплохая статья про таски. https://habr.com/ru/post/511534/
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.