Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
53 / 7 / 1
Регистрация: 06.10.2020
Сообщений: 221
.NET 7

Можно ли использовать синхронные методы в асинхронных

05.07.2023, 19:39. Показов 2123. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возник небольшой вопрос. Хочу вынести некоторый код в другую функцию (возможно, даже в другой класс) чтобы не засорять асинхронный метод. Можно ли так делать? По идее, код в асинхронном методе и код в отдельной функции, которую вызывает асинхронный метод должен выполняться одинаково.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.07.2023, 19:39
Ответы с готовыми решениями:

Какие методы UserManager следует использовать - синхронные или асинхронные?
на странице http://metanit.com/sharp/mvc5/12.14.php, Менеджер пользователей UserManager имеет синхронные и асинхронные методы,какие из них...

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

Реализовать «синхронные» методы чтения/записи для переменной типа String в java
Всем Здорова! Тут такая проблемка, нужно реализовать методы чтения/ записи для переменной типа string по следующим правилам: ...

34
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 991
07.07.2023, 11:28
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
И почитайте книги/статьи, там всё хорошо расписано...
ну вот читал я метанит и там не написано куда пойдет выполняться поток приложения ни в случае консольной программы, ни в случае UI обработчиков. могу прочитать еще раз, скорее всего проблема будет та же, так как статичный текст всегда отвечает на вопросы одинаково, а вот на форуме в общении, есть шанс выяснить ответ.

и что вы порекомендуете почитать?
п.с. то что ассинхроные методы типа

C#
1
2
3
4
5
6
7
private async void Button_Click(object sender, RoutedEventArgs e)
        {
            await Task.Delay(5000);
            Debug.WriteLine("mmmmm");
            var b = sender as Button;
            b.Content = "ffffff";
        }
будут себя так вести и все в правильных потоках делать после ожидания - мне кажется это заслуга разработчиков WPF. если взять обычное консольное приложение то такие обработчики событий очевидным образом не приклеить к потоку маин функции.

и все равно не очевидно какой код полезет выполнять UI поток после строки
C#
1
await Task.Delay(5000);
. то что он там создаст объект ожидания это окей, но раз он в блокировку не пойдет, то будет выполнять инструкции (какие есть еще варианты?). и какую же инструкцию он выполнит?
0
 Аватар для Andrey-MSK
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 4
07.07.2023, 11:41
golosalex, Вы не понимаете как оно работает и потому не можете вникнуть. Код никуда не идёт, он ставит вызывающий метод на паузу, а сам в это время может обрабатывать чего-то другое - нажатия кнопок в UI, сообщения системы т.д. Когда завершится работа в методе, который вызвали через await, код продолжит вызывающий метод с данными, которые получили из Task.

И в консольном приложении тоже можно такое провернуть, есть статья на эту тему - Asynchronous programming with async and await.
Я же вам не зря сказал - читайте литературу, запрос в поиск - c# async/await...

И самое главное - асинхронность в коде должна быть снизу вверх во всех методах которые её используют. Вот тогда всё будет работать как нужно.
0
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 991
07.07.2023, 12:23
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
И в консольном приложении тоже можно такое провернуть, есть статья на эту тему - Asynchronous programming with async and await.
Я же вам не зря сказал - читайте литературу, запрос в поиск - c# async/await...
так то что в статье вообще просте: нагенерить тасок и как-нибудь потом их подождать - не нужно иметь больших познаний.


в обработчике события процесс снаружи выглядит по другому: UI поток выполняет код синхронно, пока не натолкнется на Await,
C#
1
await Task.Delay(5000);
бросит выполнять код и где-то хрен пойми в каких закромах WPF пойдет дальше разгребать очередь задач, потому что вызов метода был без await. но через 5 секунд, ему в эту очередь задач прилетит следующая задача - огрызок того что было в ассинхронном обработчике. когда UI освободится или если он уже свободен, то выполнит и эту таску, опять же без эвейтинга.
C#
1
2
3
Debug.WriteLine("mmmmm");
            var b = sender as Button;
            b.Content = "ffffff";
напрямую то что я сказал нигде не говорится, но посмотрев то тут то там и как все работает в итоге, картина в воображении сложилась именно такая,
так вот вопрос: что это за "очередь задач", куда уходил поток после await, как остальные задачи туда попадают, как они вызываются, и как "огрызок" исходной задачи понял в какую очередь лезть (видимо тут замешан контекст синхронизации).
и вот если открыть пустое консольное приложение, то не ясно как такой механизм реализовать для главного потока.

а если полезть вверх по комментам и вспомнить то о чем говорит автор топика, то какая разница, что будет внутри у метода
BigAsyncMethod синхронный вызов или await ассинхронного? UI потоку вообще пофигу, он пошел следующую таску делать.

C#
1
await BigAsyncMethod(5000);
0
 Аватар для Andrey-MSK
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 4
07.07.2023, 12:38
Цитата Сообщение от golosalex Посмотреть сообщение
так то что в статье вообще просте: нагенерить тасок и как-нибудь потом их подождать - не нужно иметь больших познаний.
А как подождать? Вы разобрались? Там ведь нет ни Wait, ни Result нигде. Вы поняли почему так? Там просто в основном потоке в цикле проверяется любая завершенная задача. И как вы думаете это происходит? И что это вообще за операторы async/await? В какой код они разворачиваются?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,235
07.07.2023, 13:19
Цитата Сообщение от golosalex Посмотреть сообщение
и что вы порекомендуете почитать?
Такие вещи уже просто так не почитать - тут как в кулинарии - можно хоть всю кулинарную книгу выучить, если нету понимания на основе практики, то ценности у таких знаний тоже так себе.
0
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 991
07.07.2023, 13:33
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А как подождать? Вы разобрались? Там ведь нет ни Wait, ни Result нигде. Вы поняли почему так? Там просто в основном потоке в цикле проверяется любая завершенная задача. И как вы думаете это происходит? И что это вообще за операторы async/await? В какой код они разворачиваются?
"подождать" таски можно любым удобным способо, например TaskWhenAll(), или как угодно. в тексте статьи есть несколько примеров, про какой из них вы говорите?

если про последний, то там после эвейтов все делается в тредпульных потоках

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
 
namespace AsyncBreakfast
{
    // These classes are intentionally empty for the purpose of this example. They are simply marker classes for the purpose of demonstration, contain no properties, and serve no other purpose.
    internal class Bacon { }
    internal class Coffee { }
    internal class Egg { }
    internal class Juice { }
    internal class Toast { }
 
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            Coffee cup = PourCoffee();
            Console.WriteLine("coffee is ready");
 
            var eggsTask = FryEggsAsync(2);
            var baconTask = FryBaconAsync(3);
            var toastTask = MakeToastWithButterAndJamAsync(2);
 
            var breakfastTasks = new List<Task> { eggsTask, baconTask, toastTask };
            while (breakfastTasks.Count > 0)
            {
                Task finishedTask = await Task.WhenAny(breakfastTasks);
                if (finishedTask == eggsTask)
                {
                    Console.WriteLine("eggs are ready");
                }
                else if (finishedTask == baconTask)
                {
                    Console.WriteLine("bacon is ready");
                }
                else if (finishedTask == toastTask)
                {
                    Console.WriteLine("toast is ready");
                }
                await finishedTask;
                breakfastTasks.Remove(finishedTask);
            }
 
            Juice oj = PourOJ();
            Console.WriteLine("oj is ready");
            Console.WriteLine("Breakfast is ready!");
        }
 
        static async Task<Toast> MakeToastWithButterAndJamAsync(int number)
        {
            var toast = await ToastBreadAsync(number);
            ApplyButter(toast);
            ApplyJam(toast);
 
            return toast;
        }
 
        private static Juice PourOJ()
        {
 
            Console.WriteLine("Pouring orange juice");
            return new Juice();
        }
 
        private static void ApplyJam(Toast toast) =>
            Console.WriteLine("Putting jam on the toast");
 
        private static void ApplyButter(Toast toast) =>
            Console.WriteLine("Putting butter on the toast");
 
        private static async Task<Toast> ToastBreadAsync(int slices)
        {
            for (int slice = 0; slice < slices; slice++)
            {
                Console.WriteLine("Putting a slice of bread in the toaster");
            }
            Console.WriteLine("Start toasting...");
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            await Task.Delay(3000);
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            Console.WriteLine("Remove toast from toaster");
 
            return new Toast();
        }
 
        private static async Task<Bacon> FryBaconAsync(int slices)
        {
            Console.WriteLine($"putting {slices} slices of bacon in the pan");
            Console.WriteLine("cooking first side of bacon...");
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            await Task.Delay(3000);
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            for (int slice = 0; slice < slices; slice++)
            {
                Console.WriteLine("flipping a slice of bacon");
            }
            Console.WriteLine("cooking the second side of bacon...");
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            await Task.Delay(3000);
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            Console.WriteLine("Put bacon on plate");
 
            return new Bacon();
        }
 
        private static async Task<Egg> FryEggsAsync(int howMany)
        {
            Console.WriteLine("Warming the egg pan...");
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            await Task.Delay(3000);
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            Console.WriteLine($"cracking {howMany} eggs");
            Console.WriteLine("cooking the eggs ...");
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            await Task.Delay(3000);
            Console.WriteLine($"thread - {Thread.CurrentThread.ManagedThreadId}");
            Console.WriteLine("Put eggs on plate");
 
            return new Egg();
        }
 
        private static Coffee PourCoffee()
        {
            Console.WriteLine("Pouring coffee");
            return new Coffee();
        }
    }
}
первый поток не выполняет хвост.

а разварачивается все в машину состояний, там достаточно сложный код, но будет он делать не тоже самое что и обработчики событий UI потока.
когда все продолжения делаются в тредпульном потоке, все понятно, но а если я захочу, чтобы все сообщения в консоль писались только одним первым главным потоком, как в UI?
0
 Аватар для Andrey-MSK
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 4
07.07.2023, 13:53
golosalex, А вот теперь смотрите, я добавил в цикл вывод сообщения после итерации
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while (breakfastTasks.Count > 0)
{
    Task finishedTask = await Task.WhenAny(breakfastTasks);
    if (finishedTask == eggsTask)
    {
        Console.WriteLine("eggs are ready");
    }
    else if (finishedTask == baconTask)
    {
        Console.WriteLine("bacon is ready");
    }
    else if (finishedTask == toastTask)
    {
        Console.WriteLine("toast is ready");
    }
    await finishedTask;
    breakfastTasks.Remove(finishedTask);
    
    // Вот тут
    Console.WriteLine("Проверка");
}
И вот вывод проги

Так что цикл выполняется в основном потоке, пока все задачи работают...
0
 Аватар для Andrey-MSK
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 4
07.07.2023, 13:54
golosalex, Именно так и работает цикл сообщений в графических UI.
0
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 991
07.07.2023, 14:02
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
golosalex, Именно так и работает цикл сообщений в графических UI.
кажется мне вы лукавите!

C#
1
2
3
4
5
6
7
8
9
private async void Button_Click(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine($"start - {Thread.CurrentThread.ManagedThreadId}");
            await Task.Delay(1000);
            Debug.WriteLine("mmmmm");
            var b = sender as Button;
            b.Content = "ffffff";
            Debug.WriteLine($"start - {Thread.CurrentThread.ManagedThreadId}");
        }
тут же ясно видно что все кроме await Task.Delay(1000); делается в UI потоке, потому что к графическим компонентам нельзя лезть из разных потоков, чтобы с синхронизацией не мучатся.

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

вот объясните как добились такого эффекта, без очереди задач?
0
 Аватар для Andrey-MSK
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 4
07.07.2023, 14:15
Цитата Сообщение от golosalex Посмотреть сообщение
а в том коде что я выше написал, явно видно, что в консоль пишут тредпульные потоки.
А у меня в консоль писал ещё и основной поток в цикле. Вы этого не заметили?
Цитата Сообщение от golosalex Посмотреть сообщение
тут же ясно видно что все кроме await Task.Delay(1000); делается в UI потоке, потому что к графическим компонентам нельзя лезть из разных потоков, чтобы с синхронизацией не мучатся.
Я про цикл сообщений ОС, который и управляет всем что происходит в UI. Application с UI запускает при старте бесконечный цикл прослушки сообщений ОС, и на основе полученных производит нужные действия. Будь-то движение мыши, нажатие клавиш, получение данных откуда-нибудь и их прорисовка в элементах (Binding)...
Синхронизация контекста это немного из другой оперы. Тем более, если не изменять коллекции, а действовать только с элементами типа TextBox, то ничего страшного в потоках не будет. Диспетчер сам разрулит это.
0
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 991
07.07.2023, 14:27
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А у меня в консоль писал ещё и основной поток в цикле. Вы этого не заметили?

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
// Вот тут
    Console.WriteLine("Проверка");
вы про это? почему вы решили что будет писать главный поток? я проверил и у меня разный ID на старте и в том месте.
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Синхронизация контекста это немного из другой оперы. Тем более, если не изменять коллекции, а действовать только с элементами типа TextBox, то ничего страшного в потоках не будет. Диспетчер сам разрулит это.

сомневаюсь что хоть какие-то свойства в UI менять из разных потоков безопасно. чуть поехала верстка - невалидное состояние объектов - падение с непредсказуемой ошибкой.
0
 Аватар для Andrey-MSK
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 4
07.07.2023, 14:46
Цитата Сообщение от golosalex Посмотреть сообщение
я проверил и у меня разный ID на старте и в том месте.
Ну ID я не проверял... Может и ошибаюсь...
Цитата Сообщение от golosalex Посмотреть сообщение
сомневаюсь что хоть какие-то свойства в UI менять из разных потоков безопасно.
Одиночные можно, проверено не один раз...
Цитата Сообщение от golosalex Посмотреть сообщение
чуть поехала верстка - невалидное состояние объектов - падение с непредсказуемой ошибкой.
А причем тут верстка и значение свойства Binding элемента UI?

Но всё это лирика... Вы разобрались что такое async/await? В какой код они разворачиваются? Если нет, то возьмите книжку Джозефа и Бена Албахари любую, на выбор и прочитайте главу про Параллелизм и асинхронность. Вот там подробно рассказано что такое async/await, и как оно работает, и какому коду с Task оно соответствует.
0
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 991
07.07.2023, 15:16
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Но всё это лирика... Вы разобрались что такое async/await? В какой код они разворачиваются? Если нет, то возьмите книжку Джозефа и Бена Албахари любую, на выбор и прочитайте главу про Параллелизм и асинхронность. Вот там подробно рассказано что такое async/await, и как оно работает, и какому коду с Task оно соответствует.
ну я итак более-мение понимал что оно делает, только не понимаю 2-х вещей: зачем делать в тредпульных тасках еще один тредпульный таск и передавать ему управление, чтобы продолжение задачи было сделано еще в 3-м тредпульном таске, (вложенные await)

и как же добились такого реально полезного эффекта в обработчиках событий, что продолжение делает не какой-то а именно UI поток.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А причем тут верстка и значение свойства Binding элемента UI?
представим картину: WPF рисует дерево и прошел процедуру measure и делает arrange для "инвалидированного" куска визуального дерева. а тут вы у одного из узлов поменяли свойство, что влияет на размер, что при этом произойдет вообще большой вопрос.
если свойство менять не у UI элемента, а у ViewModel, то там ничего страшного, а вот у компонента напрямую я бы не рискнул, да и ошибка будет, так как [STAThread] на UI потоке стоит и все UI элементы надо через диспетчер менять.
0
 Аватар для Andrey-MSK
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 4
07.07.2023, 15:47
Цитата Сообщение от golosalex Посмотреть сообщение
если свойство менять не у UI элемента, а у ViewModel, то там ничего страшного,
Я именно про VM имел ввиду, и замена значений свойств для Binding. Но если в асинхронном методе VM меняется коллекция, которая привязана к элементу UI, то вот там нужно уже включать синхронизацию, либо через Dispatcher, либо через SynchronizationContext.
Разметку меняет только сам View и его поток, больше никто. А в классе Window это решить проще простого
C#
1
2
3
4
5
6
public class MainWindow : Window
 
SynchronizationContext ViewContext = SynchronizationContext.Current;
 
// И далее в асинхронном методе
ViewContext.Post(vc = > { ... }, null);
Добавлено через 3 минуты
Цитата Сообщение от golosalex Посмотреть сообщение
и как же добились такого реально полезного эффекта в обработчиках событий, что продолжение делает не какой-то а именно UI поток.
Дак эта фича скорее всего и делалась именно для UI, чтоб не тормозило В консоли полезность этого сомнительна
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16154 / 11275 / 2890
Регистрация: 21.04.2018
Сообщений: 33,154
Записей в блоге: 2
12.07.2023, 22:38
Цитата Сообщение от golosalex Посмотреть сообщение
сомневаюсь что хоть какие-то свойства в UI менять из разных потоков безопасно.
Создайте своё кастомное CLR-свойство и можете менять его из любого потока.

Цитата Сообщение от golosalex Посмотреть сообщение
если свойство менять не у UI элемента, а у ViewModel, то там ничего страшного,
Ну... Если более детально, то в привязки встроен маршалинг уведомления об изменении свойства в UI поток целевого объекта.
Для INotifyCollectionnnChanged.CollectionCha nged и ICommand.CanExecuteChanged маршалинга нет и их вызов не из UI потока приведёт к исключению.

Если рассматривать UWP там наоборот: для CollectionChanged и CanExecuteChanged есть маршалинг, а для PropertyChanged - нет.

Для платформ Xamarin, Avalonia, UNO и др. - не знаю. Нужно проверять.
Для Форм привязки тоже есть, но как там с маршалингом в UI поток - не знаю.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Дак эта фича скорее всего и делалась именно для UI, чтоб не тормозило
Не...
Это один из способов обеспечения потокобезопасности - нужно для синхронизации с графической системой.
Когда с объектом происходит взаимодействи только в одном потоке - это гарантирует его потокобезопасность.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.07.2023, 22:38

AsyncTask. Можно ли использовать методы return внутри?
При том что они нужны только для другого метода? Или придется либо в один метод всё поместить или создавать переменные и присваивать...

Можно ли в Yii во внешнем действии использовать дополнительные методы?
Имеется ввиду методы помимо run() и обращаться к ним в run() через $this ?

Можно ли методы типа bool использовать в условиях? (NullReferenceException)
Выполнение приводит к ошибке &quot;object reference not set to an instance of an object&quot;. Я предполагаю, что это происходит здесь: var...

Какие методы можно использовать для решения данной математической модели?
Какие методы можно использовать для решения данной математической модели?И как правильно это сделать? (Приложен файл)

ООП в VBA: Можно ли использовать методы класса внутри его самого
Интересует: является ли это хорошим стилем программирования, или это приведет к проблемам? Извините, пожалуйста, если плохо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru