Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Непонятно с async-await в C# - 2

1777  1 2 3 4 5 все
AlexNek патриот05.09.21 11:40
AlexNek
NEW 05.09.21 11:40 
в ответ Бесконечный цикл 04.09.21 21:49
Это не интерпретация - это основы

откуда такая страсть к конспектированию первоисточников? спок

Зачем разбираться в чем что не имеет связи с конкретной имплементацией?


нельзя вызвать и получить значение

очень даже можно


Единственно что можно это добавить ее как таск в очередь

Нет в шарпе никаких очередей для этого, есть стейт машина.


Это явный сигнал диспетчеру

нет и специального диспетчера для асинков.


То есть всё, что касается шарпной имплементации совсем не соответствует действительности. Ну зачем такая теория,которая даже и не теория.

#41 
AlexNek патриот05.09.21 11:47
AlexNek
NEW 05.09.21 11:47 
в ответ alex445 05.09.21 08:17

Чувствуется научный работник смущ


Тут палка о двух концах

ну это я и называю законом сохранения энергии.

#42 
AlexNek патриот05.09.21 11:56
AlexNek
NEW 05.09.21 11:56 
в ответ alex445 05.09.21 08:29
я не встретил примера постоянно обновляемого графика

https://arction.com/lightningchart-ultimate-sdk/

не пробовал, но пишут - allows rendering 16 billion data points simultaneously.

#43 
alex445 свой человек05.09.21 15:35
NEW 05.09.21 15:35 
в ответ AlexNek 05.09.21 11:47, Последний раз изменено 05.09.21 15:37 (alex445)
Чувствуется научный работник

Я к настоящей науке отношусь примерно как девушка, желающая похудеть, к олимпиадной лёгкой атлетике - ну т.е. тоже что-то там хожу-бегаю вокруг своего дома, как умею, чтобы вес сбросить. Но и только. )))


https://arction.com/lightningchart-ultimate-sdk/

не пробовал, но пишут - allows rendering 16 billion data points simultaneously.

Pricing - Purchase or renew LightningChart .NET subscription - Arction

От полутора килобаксов на одного разработчика. Понятно, что нас нищий научный институт не мог себе такого позволить. Судя по их описанию, они там жуткий "code to metal" использовали - наверняка переписали систему рендеринга для компонента, обходя встроенную в WPF.


Кроме того, есть рекомендация "For best performance in WPF and multithreading benefits, select Non-Bindable chart.". Чарт, насколько я знаю, это одно окошко с графиком - т.е. там все графики должны быть без привязок. Мне иногда нужно было добавить всякие "зоны" с подсветкой и привязками прямо на график. Так что самый быстрый и оптимальный вариант отпадает. А что там реально у них - ещё испытывать надо (30 дней дают). Но в любом случае, для коммерческого распространения - полтора килобакса на разработчика, а Dynamic Data Display бесплатен, т.к. его разработка оплачивалась Майкрософт по одной из их программ по развитию платформы.


У меня примерно так всё выглядело. График слева - "бегущий". По простому варианту вообще в 2-3 тыщи точек (index) укладывались, но это если с OBD по CAN-шине приходили уже посчитанные внутри мозгов движка обороты. Кстати, вспомнил, что эта прога была защищена ключём HASP - там дополнительные настройки и опции в программе скрывались, если специальный разрабский ключ не вставлен в USB. В настрйках дефолтные нереальные значения представлены (не вбиты параметры конкретного устройства), поэтому мощность маленькая.



#44 
alex445 свой человек05.09.21 15:46
NEW 05.09.21 15:46 
в ответ alex445 05.09.21 15:35, Последний раз изменено 05.09.21 16:09 (alex445)

Вот, кстати, как выглядит отчёт - генерится FlowDocument на WPF, затем сохраняется в XPS или PDF. Контролы с цветными полукругами и шкалами - самописные, с байндингами положений стрелочек по измеренным параметрам. По всему приложению поддерживается многолокальность, но переведено всё лишь на 2 локали - русскую и английскую. Весь отчёт заполняется по объекту результатов - отсылаю результаты во вью-модель отчёта, и дальше вяжу эту вью-моедль ко вьюхе FlowDocument, который затем сохраняется в файл. Ну и плюс результаты отсылаются нам на сервер в базу данных (через WCF service), где и сайт крутится (ASP.NET MVC), который может показать результаты по проведённым опытам и статистику. Единственное, я не разобрался с защитой сайта - ну, чтобы сервис работал через сертификаты. Не успел разобраться с собственным сертификационным центром и самоподписанными сертификатами, и как его к нашему сервису приделать.


#45 
alex445 свой человек05.09.21 16:15
NEW 05.09.21 16:15 
в ответ alex445 05.09.21 15:46

Насчёт этой библиотеки графиков - они и для WPF с Win Forms поддерживают, а говорят, что это сейчас на рынке никому не надо и лишь старьё мамонта поддерживать. Но раз продают, занчит покупают для этих платформ, а значит, и новые разработки ведут. Просто на фоне орды джаваскриптеров и мобильных разработчиков это теряется.

#46 
AlexNek патриот05.09.21 16:31
AlexNek
NEW 05.09.21 16:31 
в ответ alex445 05.09.21 15:35

Речь то шла прежде всего о быстром, а теперь уже значит и бесплатный.


Вроде рекламируют тоже

https://lvcharts.net/App/examples/Wpf/start

It depends on the case, In general the geared package is really fast, in the best case it can plot 10 million points in a second, but don't trust this, give it a try, you can easily test an application running LiveCharts.Geared by cloning this repository.

#47 
Бесконечный цикл посетитель05.09.21 19:23
NEW 05.09.21 19:23 
в ответ AlexNek 05.09.21 11:40
Зачем разбираться в чем что не имеет связи с конкретной имплементацией?

Чтобы потом не разбираться в 20 различных имплементациях. Асинхронное программирование и корутины существуют десятки лет, и каждый норовит ввести свои термины и свою специфику.


Нет в шарпе никаких очередей для этого, есть стейт машина.

Если нет очереди, то значит текущие запущенные корутины нигде не хранятся, а значит система и не может их выполнить (она про них ничего не знает). Значит ничего выполняться вообще не будет.


нет и специального диспетчера для асинков.

А кто тогда решает, что выполнять в следующий момент из нескльких альтернативных вариантов? Если никто не рашает (диспетчера ведь нет), то значит в C# можно выполнять только чисто последовательные программы.Классный язык - мне нравится.


#48 
Murr патриот05.09.21 21:52
Murr
NEW 05.09.21 21:52 
в ответ alex445 05.09.21 08:40

И тогда понимание сути устареет.

-----

Как бы тебе по-проще это объяснить...

Устареет - занание конкретной имплементации.

Но конкретную имплементацию в деталях никто, ну кроме разработчиков, в голове не держит.

В голове держат какую-то модель... и не факт что модель станет неактуальной... а правильная модель - 100% останется...


чтобы просто поехать

-----

Пустыня. Куча дохлых машин. Все водители - передохли.

У тебя - выбор - присоеденится к водителям или найти подходящую систему впрыска для замены твоей сдохшей...

Это, кстати, довольно близкая аналогия к ситуации в программировании...

#49 
Murr патриот05.09.21 22:07
Murr
NEW 05.09.21 22:07 
в ответ AlexNek 05.09.21 11:40

Нет в шарпе никаких очередей для этого

-----

Это не важно.

Важно что предложенная модель объясняет происходящее...


При компиляции требуется складывать и извлекать элементы в/из стека.

При написании методом рекурсивного спуска - никакого выделенного стека нет.

Но есть рекурсивный вызов процедуры, при котором создаются локальные переменные...

Так что, будем говорить что стек не нужен? и ничего что переменные обычно создаются на стеке.

#50 
alex445 свой человек06.09.21 01:23
NEW 06.09.21 01:23 
в ответ Murr 05.09.21 21:52

чтобы просто поехать

-----

Пустыня. Куча дохлых машин. Все водители - передохли.

У тебя - выбор - присоеденится к водителям или найти подходящую систему впрыска для замены твоей сдохшей...

Это, кстати, довольно близкая аналогия к ситуации в программировании...

Я, наверное, сдохну - это проще. )))

#51 
alex445 свой человек06.09.21 01:26
06.09.21 01:26 
в ответ Murr 05.09.21 22:07

При компиляции требуется складывать и извлекать элементы в/из стека.

При написании методом рекурсивного спуска - никакого выделенного стека нет.

Но есть рекурсивный вызов процедуры, при котором создаются локальные переменные...

Так что, будем говорить что стек не нужен? и ничего что переменные обычно создаются на стеке.

Не знаю, про какой стек вы речь ведёте, просто не так давно я давал ссылку на Эрика Липперта, который сказал в том смысле, чтобы мы, пользователи Сишарпа, не заморачивались, где реально создаются переменные - стек, куча или параллельная реальность, ибо это от нас не сильно зависит, и компилятор сам решает, где что создать. Если много переменных создавать, которые должны быть в стеке, а они туда не помащаются, то их создадут в куче.

#52 
Murr патриот06.09.21 02:03
Murr
NEW 06.09.21 02:03 
в ответ alex445 06.09.21 01:23

это проще

-----

Конечно - "Здравствуй, Касса!"... смущ

#53 
alex445 свой человек06.09.21 11:55
NEW 06.09.21 11:55 
в ответ Murr 06.09.21 02:03, Последний раз изменено 06.09.21 11:58 (alex445)

Туда тоже ещё попасть надо. Тот же немецкий должен быть на хорошем уровне. Да банально надо несколько лет опыта, чтобы язык "примелькался", чтобы разные говоры, интонации, произнесённые при разных условиях, узнаваться начали.


У меня даже ощущение, что устроиться программистом с плохим немецким и даже английским (разговорный на уровне средненького В1, например), но с хорошими знаниями программирования (опять же, не отличными, а просто хорошими) проще, чем на кассу в Лидл.

#54 
AlexNek патриот06.09.21 22:22
AlexNek
NEW 06.09.21 22:22 
в ответ Murr 05.09.21 22:07
Важно что предложенная модель объясняет происходящее...

Я как то не привык к сферическим коням в вакууме смущ


ну вот например программка что была

    private static async Task TestWithDirectAwait()
        {
            Wait1();
            Console.WriteLine("after wait1");
            await Wait2();
            Console.WriteLine("after wait2");
            await Wait3();
            Console.WriteLine("after wait3");
        }

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

***State Machine Main MoveNext -1

***State Machine TestWithDirectAwait MoveNext -1

after wait1

***State Machine Wait2 MoveNext -1

wait2 Start tread id 1 (Main1-1)

***State Machine Wait2 MoveNext 0

wait2 for 2000 is ready after 00:00:02.0550266 tid 4 (Main2-4)

***State Machine TestWithDirectAwait MoveNext 0

after wait2

***State Machine Wait3 MoveNext -1

wait3 Start tid 4 (Main2-4)

***State Machine Wait3 MoveNext 0

wait3 for 1000 is ready after 00:00:03.0750480 tid 6 (Main3-6)

***State Machine TestWithDirectAwait MoveNext 1

after wait3

***State Machine Main MoveNext 0

Summary time 00:00:03.0754335 thread Id 6


Вот объясни мне по модели, как это все работает. При этом у тебя есть только

  • State Machine
  • Synchronization context
  • Execution Context
  • ThreadPool
  • TaskScheduler


#55 
AlexNek патриот06.09.21 22:27
AlexNek
NEW 06.09.21 22:27 
в ответ Бесконечный цикл 05.09.21 19:23
Чтобы потом не разбираться в 20 различных имплементациях

Вообще то достаточно разобраться в одной, конкретной.


Если нет очереди,

Ну если, как говорят некоторые и стэк есть очередь..

Но для меня это слишком круто спок


#56 
alex445 свой человек08.09.21 16:42
NEW 08.09.21 16:42 
в ответ AlexNek 01.09.21 21:56, Последний раз изменено 08.09.21 16:43 (alex445)

Чего он в самом начале (слайд примерно на 8 минуте) взъелся на то, что для организации async/await что-то там потребляется - аж сотня-другая байт памяти и несколько десятков наносекунд (на каком железе ещё не упомянуто)? А оно должно в принципе бесплатным быть, или как?


Я почему-то думаю, что в каком-нибудь "асинхронном" джаваскрипте организация разных корутин стоит дороже. А создание потоков через Thread в Сишарпе - оно бесплатно?


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

#57 
AlexNek патриот08.09.21 20:24
AlexNek
NEW 08.09.21 20:24 
в ответ alex445 08.09.21 16:42
Чего он

Сорри, пока некогда на что друргое перключаться

#58 
Murr патриот09.09.21 02:25
Murr
NEW 09.09.21 02:25 
в ответ AlexNek 06.09.21 22:22

Вот объясни мне

-----

А ты упрости...

#59 
AlexNek патриот09.09.21 19:55
AlexNek
NEW 09.09.21 19:55 
в ответ Murr 09.09.21 02:25


А ты упрости...

А там нечего убирать, вот часть оригинала. Приложение консольное.

Обыгрывается только лишь енто все остальное отладка

 await Task.Delay(delay);


        private static async Task TestWithDirectAwait()
        {
            Wait1();
            Console.WriteLine("after wait1");
            await Wait2();
            Console.WriteLine("after wait2");
            await Wait3();
            Console.WriteLine("after wait3");
        }
        private static void Wait1()
        {
            SetThreadName();
            Console.WriteLine($"wait1 Start tid {Thread.CurrentThread.ManagedThreadId} ({Thread.CurrentThread.Name})");
            int delay = 3000;
            Task.Delay(delay);
            SetThreadName();
            Console.WriteLine($"wait1 for {delay} is ready after {DateTime.Now - _startTime} tid {Thread.CurrentThread.ManagedThreadId} ({Thread.CurrentThread.Name})");
        }

        private static async Task Wait2()
        {
            SetThreadName();
            Console.WriteLine($"wait2 Start tid {Thread.CurrentThread.ManagedThreadId} ({Thread.CurrentThread.Name})");
            const int delay = 2000;
            await Task.Delay(delay);
            SetThreadName();
            Console.WriteLine($"wait2 for {delay} is ready after {DateTime.Now - _startTime} tid {Thread.CurrentThread.ManagedThreadId} ({Thread.CurrentThread.Name})");
        }
#60 
1 2 3 4 5 все