Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2016, 09:26   #1
I_Enjoy_C#
 
Регистрация: 13.03.2016
Сообщений: 9
По умолчанию Сетевое асинхронное приложение. C#

Сервер зависает вот на этой строке:
Код:
var msg = await clientView.ReadChatMessageAsync();
До нее все доходит и посылается проверено отладчиком. Весь код не хочу тут приводить, да он и не влезет (кажется тут лимит на символы), но ReadChatMessageAsync описана так, если надо:
Код:
public Task<ChatMessage> ReadChatMessageAsync()
{
	return new Task<ChatMessage>(() => ChatMessage.Deserialize(Stream));
}
Помогите пожалуйста! Никак не пойму в чем проблема, клиент точно посылает сообщение, но оно судя по всему не доходит

Последний раз редактировалось I_Enjoy_C#; 13.03.2016 в 09:29.
I_Enjoy_C# вне форума Ответить с цитированием
Старый 13.03.2016, 12:29   #2
I_Enjoy_C#
 
Регистрация: 13.03.2016
Сообщений: 9
По умолчанию

На коленке набросал консольный синхронный листенер в несколько строк. Он все принимает отлично. Значит клиент данные точно выслал, а вот асинхронный тупит

Последний раз редактировалось I_Enjoy_C#; 13.03.2016 в 12:41.
I_Enjoy_C# вне форума Ответить с цитированием
Старый 13.03.2016, 12:45   #3
I_Enjoy_C#
 
Регистрация: 13.03.2016
Сообщений: 9
По умолчанию

Я вообще недавно только разобрался со всей этой асинхронностью и мог напортачить конкретно с ней. У меня подозрение что что то там не так... Вот еще код десериализатора. Используется XmlSerializer (данные в xml передаю) и NetworkStream.
Код:
public Task<ChatMessage> ReadChatMessageAsync()
{
	return new Task<ChatMessage>(() => ChatMessage.Deserialize(Stream));
}

public static ChatMessage Deserialize(Stream stream)
{
	return Serializer.Deserialize(stream) as ChatMessage;
}
I_Enjoy_C# вне форума Ответить с цитированием
Старый 13.03.2016, 12:53   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну как минимум надо использовать Task.Factory.StartNew или Task.Run вместо просто new.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.03.2016, 12:58   #5
I_Enjoy_C#
 
Регистрация: 13.03.2016
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну как минимум надо использовать Task.Factory.StartNew или Task.Run вместо просто new.
Это почему же? По моему так тоже должно канать. Просто у этих методов них нету нужных делегатов, они есть только в конструкторе
I_Enjoy_C# вне форума Ответить с цитированием
Старый 13.03.2016, 13:04   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Как это нет? Все есть, что именно вам от конструктора надо?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.03.2016, 13:25   #7
I_Enjoy_C#
 
Регистрация: 13.03.2016
Сообщений: 9
По умолчанию

А да, действительно есть, почему то раньше их не замечал. Но все равно не помогло что то... Не доходят сообщения
I_Enjoy_C# вне форума Ответить с цитированием
Старый 13.03.2016, 13:28   #8
I_Enjoy_C#
 
Регистрация: 13.03.2016
Сообщений: 9
По умолчанию

Точнее даже так: сообщение приходит только когда клиент дисконнектится, совершенно случайно заметил.
I_Enjoy_C# вне форума Ответить с цитированием
Старый 13.03.2016, 15:38   #9
I_Enjoy_C#
 
Регистрация: 13.03.2016
Сообщений: 9
По умолчанию

Дальше еще интереснее!!! Все в тот же написанный на коленке синхронный листенер я добавил все эти ChatMessage и ClientView и попробовал запустить все (в том числе и десериализацию) синхронно. Так вот абсолютно та же фигня - все повисает на десериализации XmlSerializer-ом сообщения из NetworkStream. Почему так происходит? Причем если я просто из этого потока считываю буфер как байты, потом перекидываю в MemoryStream и уже из него десериализовываю - то все работает нормально. А вот из NetworkStream-а хоть убей не хочет десериализовывать. При том сериализовывает в него (на стороне клиента) он нормально...

Хотя самым интересным по прежнему остается вот это!
Цитата:
Сообщение от I_Enjoy_C# Посмотреть сообщение
Точнее даже так: сообщение приходит только когда клиент дисконнектится, совершенно случайно заметил.

Последний раз редактировалось I_Enjoy_C#; 13.03.2016 в 15:41.
I_Enjoy_C# вне форума Ответить с цитированием
Старый 13.03.2016, 15:45   #10
I_Enjoy_C#
 
Регистрация: 13.03.2016
Сообщений: 9
По умолчанию

У меня есть единственное подозрение. Когда я работал с StreamWriter, то чтобы нормально работало надо было у него AutoFlush в true устанавливать чтобы он сбрасывал данные сразу же. Может ли тут быть та же фигня? У NetworkStream нет свойства AutoFlush, но есть метод Flush. Причем не ясно делает ли он что то, т.к. в комментах студии написано "Этот метод зарезервирован для использования в будущем.". Да и вроде попробовал его вызывать, ничего не дает...
I_Enjoy_C# вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Большой проект (чтение com, БД, картография) - сетевое приложение для windows tarakan1983 Фриланс 25 14.01.2015 20:34
Сетевое приложение (Клиент-сервер) Unique Работа с сетью в Delphi 9 10.05.2012 22:01
сетевое приложение на J2ME TitanicMan Общие вопросы по Java, Java SE, Kotlin 1 08.01.2010 03:33
Сетевое приложение для удаленного запуска программ. Ветас Работа с сетью в Delphi 2 11.11.2007 09:19