Как стать автором
Обновить

Комментарии 38

Снаряд не может ждать, пока отрисуется танчик, танк не может ждать пока рисуется стена, чтобы пошевелится.

… а у вас рисовалка умеет много потоков?


1-й поток (мэйн) — должен отправлять нажатую клавишу на сервер.
2-й поток должен принимать координаты танков.
3-й координаты стен.
4-й координаты снарядов.

А почему выделенные потоки, а не событийная модель?


Небольшое описание потоков: любой поток создаётся через пространство System.Threading.

А почему не тредпул? Почему не таски с cooperative cancellation?

Хорошо, я учту это.
Перед написанием следующей статьи я сделаю небольшую ремарку
Замечания:
1. Зачем вам класс Thread? Используйте Task. И почитайте про асинхронность. Судя по вашему методу мейн, если при открытии конзоли вы не нажмете клавишу, то мы понапрасну будем есть очень много ресурсов.
2. Не знаю в какие дебри вы залезли с http, но его использовать будет гораздо проще(потому что это текстовый протокол, а не бинарный коим являеться tcp). Особенно если вы планируете веб приложение, вам надо делать ставку на http.
3. Было бы не плохо выложить ссылку на репозиторий с кодом. В таком соятоянии, я вообще не вижу кода на расте, а по c# вам надо прочитать style guide. Именование методов с подчеркиванием разве что в WinForms я и видел, которые уже устарели.
НЛО прилетело и опубликовало эту надпись здесь
Хорошо, спасибо огромное)

(пока что с http сложно, ибо сервер будет на Раст, а я пока не сильно разобралась с http сервером в растбуке, но спасибо за пожелание)
Наша новая задача звучит так: создать структуру
public struct player_coor { public static

Вот только у вас не структура, а пространство имен для бедных. Структура, в которой все поля статические — это боль, а не структура. И в многопоточности вы об нее убъетесь. И use вам низачем не нужен, понятное дело.


А вообще, C# — объектно-ориентированный язык, какая религия вам помешала объекты использовать?

Религия коллекций и прочитанной литературы по низкоуровневым языкам, спасибо за критику и я изменю код в следующей статье)

А зачем вы пишете на высокоуровневом языке, как на низкоуровневом? Не надо так делать. В C# и коллекция — объект.

Спасибо большое)
Ждем публичную репу параллельно с продолжением
А чем вам дженерики не угодили, раз вы ArrayList используете?
Дженерики изучены только в расте, простите :p

Учту при создании следующей статьи )
Странная статья, конечно. Но куда более странные комментарии. Автор же ясно дал понять, что он новичок. А вы просите объяснения почему сделано так, а не иначе. На этом этапе
пробуют, а не принимают решения.
Ну то есть теоретически, конечно, важно указать на ошибки, но практически опыта чтобы вообще эти ошибки понять ещё нет (я, конечно, могу ошибаться).
Спасибо большое)

Да, я ещё не опытный программист, но стараюсь им стать и именно поэтому выложила эту статью. Где ещё можно услышать критику и советы, кроме как хабра и киберфорума?
(если есть ресурсы — дайте пожалуйста, буду очень благодарна за развитие моей грамотности)
А вы просите объяснения почему сделано так, а не иначе. На этом этапе пробуют, а не принимают решения.

Вопросы "почему так сделано" очень полезны как раз, они заставляют задуматься. Если взято произвольное первое попавшееся решение (как здесь с потоками), то лучше вернуться на шаг назад.

Опять же теоретически. На практике когда ты только начинаешь, то пробуешь то, что работает. И не сильно важно что это — потоки, асинхронка, тред пул, между ними просто не видишь разницы. На этом этапе задавать вопрос «почему так сделано» просто бессмысленно, так как предметная область ещё не осела в голове. Гораздо полезнее просто писать рабочий (возможно через задницу) код.
И не сильно важно что это — потоки, асинхронка, тред пул, между ними просто не видишь разницы.

Так чтобы увидеть разницу, надо все это попробовать как раз.


Гораздо полезнее просто писать рабочий (возможно через задницу) код.

Зачем привыкать писать через задницу?

Огромное спасибо всем за правку меня, напомню что я постоянно улучшаю код, а значит что и постоянно меняется код в статье (старые варианты я оставляю).

Зачем, зачем у вас внутри async-методов await Task.Run?

Ибо там мы и запускаем асинхронный код
Если вкратце, то этот тестовый код:

class Program
    {
        public async void MyMethodAsync()
        {
            Console.WriteLine("Метод MyMethodAsync - до запуска задачи");
            await Task.Run(
             () =>
             {
                 Console.WriteLine("Метод MyMethodAsync - задача запущена.");
                 for (int i = 0; i < 50;)
                     Console.WriteLine("Мы все дружно ждём [" + i++.ToString() + "] раз от потока Асинхронности");

                 Console.WriteLine("Метод MyMethodAsync - завершение выполнения задачи");
             });
            Console.WriteLine("Метод MyMethodAsync - выполнение задачи завершено");

        }
        static void Main(string[] args)
        {
            Program mc = new Program();
            Console.WriteLine("Метод Main - до запуска задачи");
            mc.MyMethodAsync();            
            Console.WriteLine("Метод Main - после запуска задачи");
            for (int i = 0; i < 50;)
                Console.WriteLine("Мы все дружно ждём ["+i++.ToString()+"] раз от потока Main");
            Console.ReadKey();
        }
    }


Дал такой результат:
image

На его основе я думаю, что смогу принимать данные из веб-сокета независимо от ввода клавиши из потока мэйн, если я не права: поправьте, буду благодарна!

… а теперь уберите await перед Task.Run. Что изменится? Правильно, одна строчка в консоли, и эта строчка не имеет никакого отношения к выполняемой задаче. После этого со спокойной душой можно переделывать MyMethodAsync из async void в просто void, и наблюдать, что тоже ничего не меняется.


В вашем случае вся конкурентность обеспечена Task.Run, и в этом смысле он ничем не отличается от ThreadPool.QueueUserWorkitem. Ровно то же самое можно написать на чистых тредах с явным управлением, и опять ничего не изменится.


Так зачем вам нужна эта пара async-await, если вы ей вообще не пользуетесь?

Программа приостанавливается на методе ReadKey() и именно в этот момент должна не прекращаться отрисовка и передача данных с сервера.

Предложите свой вариант, я буду очень признательна.

Говорю же: убираете из вашего кода async и await и наблюдаете за результатом.


(вы понимаете, что делает await?)

Хорошо, спасибо)

Не совсем

Ну так может надо сначала разобраться, чем в код запихивать?

Хорошо, я верну старое распоточивание, пока не разберусь с асинхронностью в концепции c#

Тогда придется разобраться, как обойтись без Thread.Abort. Кстати, треды — это, очевидно, не синхронная модель (как вы пишете в посте).

Я поняла вас, спасибо за указание на ошибку.

Для тех кто минусует, прочтите: habrahabr.ru/post/109345
А нет, не поняла…
А нет, разобралась
Умиляет)
Я полностью переписываю код, так как пообщавшись с более опытными людьми (которых я встретила тут) я поняла как лучше будет организовать всё =)

Главное что стоит помнить — надо рисковать!
Без риска я не увидела бы ошибок и не пообщалась бы с таким количеством добрых людей) Спасибо вам, ближе к пятнице будет новая статья (надеюсь что и сервер успею дописать, суммарное кол-во строк кода сейчас 700 и все их придётся разобрать (будет очень больно голове обьяснять))

С# легкий для изучения язык и вы не знакомы с дженерикамм, делегатами, TPL, пишите в процедурном стиле. Я два года рытаюсь писать и чем дальше, тем больше вопросов, а ещё ведь он обновляется. А комментарии очень конструктивны, особенно по соккетам.

Я понимаю что это, но в силу того что мы ещё не прошли по программе я учу это сама и пока что не разобралась полностью. Моя тактика: писать сразу в бой.

Да, я понимаю что эта тактика очень и очень плоха, но именно это и подталкивает новичков на каких-либо ошибках лезть в оф. документацию и узнавать что-то новое.

И да, без ошибок не бывает годных проектов, поэтому я и выкладываю сюда, чтобы услышать конструктив.
Направление хранить числом тоже не самая лучшая идея. Для хранения направления лучше подойдет либо перечисление (то же число, но не надо помнить какое значение что означает) — либо даже вектор из двух чисел.
Не имеет смысла, так как направление — это угол, а он будет в полноценной версии (на WinForm) рассчитываться немного иначе)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации