Перехват исключения асинхронной операции не работает

У меня TCP клиент от

System.Net.Sockets

public async void startTCP()
{
    await client.ConnectAsync(IPAddress, port);
    stream = client.GetStream();
}

Я окружаю его блоком try catch, но когда я запускаю код, возникает это исключение, и VS показывает, что я нахожусь в

UnhandledException += (sender, e) =>
{
    if (global::System.Diagnostics.Debugger.IsAttached) 
        global::System.Diagnostics.Debugger.Break();
};

в App.g.i.cs не там, где я хочу быть => Самостоятельно обрабатывать исключение

System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: The requested address is not valid in its context 255.255.255.255:25565 at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult) at System.Net.Sockets.TcpClient.EndConnect(IAsyncResult asyncResult) at System.Net.Sockets.TcpClient.<>c.b__21_1(IAsyncResult asyncResult) at System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task1 promise, Boolean requiresSynchronization) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at PersonDesk.Socket.d__10.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.b__6_0(Object state) at System.Threading.WinRTSynchronizationContext.Invoker.InvokeCore()}

IP-адрес - это просто заполнитель для возникновения исключения.

где попробовать ... улов ??

NicoRiff 24.05.2018 15:41

Находится ли try-catch внутри метода startTCP или там, где вы его называете? async void означает, что startTCP запущен и забыт, поэтому вы не сможете обрабатывать исключения вне метода.

juharr 24.05.2018 15:44

Возможный дубликат async / await - когда вернуть задачу против void?

mjwills 24.05.2018 15:50

используйте «public async Task StartTcpAsync ()» вместо «public async void startTCP ()»

tzm 24.05.2018 17:10

Пробная ловушка находится за пределами StartTCP, как я ее называю.

Evžen Křídlo 24.05.2018 23:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
292
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
public async void startTCP()

это async void. Вы не должны этого делать. Так как

I surround it with try catch block

и это единственное, что не работает с async void.


Для полного ответа вам нужно будет показать, как вызывается startTCP (). Задействована вся цепочка вызовов.

Кажется, это касается WPF, поэтому начните с обработчика событий (чтобы может был async void).

Итак, если я изменю его тип на Task, тогда я смогу перехватить исключения, вызванные асинхронной операцией в вызывающем методе?

Evžen Křídlo 24.05.2018 23:08

Также это не wpf, а Uwp.

Evžen Křídlo 24.05.2018 23:11

Спасибо за помощь, я этого не знал. Теперь работает.

Evžen Křídlo 25.05.2018 10:11

Другие вопросы по теме