Ассинхронная работа с вкладкой браузера

SlipDez

Client
Регистрация
18.07.2018
Сообщения
453
Благодарностей
86
Баллы
28
Ранее была тема Помогите реализовать Асинхронную работу Со вкладками браузера в зенки C# появилась аналогичная задача. И нет, мне не надо открывать 100500 вкладок надо снифать трафик. Но при попытке обращаться асинхронно вкладка после первой итерации цикла становится недоступна((

как решить проблему?
ни один метод не сработал для меня


Не работает:
DateTime startTime = DateTime.Now; // Запоминаем время старта

System.Threading.Tasks.Task.Run(() =>
{
    while ((DateTime.Now - startTime).TotalSeconds < 30) // Проверяем, не прошло ли 30 сек
    {
        Thread.Sleep(1000); // Ждем 1 секунду
        project.SendInfoToLog("Собираем трафик...");
        var traffic = instance.ActiveTab.GetTraffic(); // Получаем трафик
        project.SendInfoToLog(traffic.Count().ToString());
        foreach (var t in traffic)
        {
            project.SendInfoToLog(t.Url.ToString());
        }
    }
});
Выполнение Task _ = async_function()
тоже не срабатывает ошибка обращения к Tab пишет что не доступна

как вообще можно собирать трафик ассинхронно?
 

SlipDez

Client
Регистрация
18.07.2018
Сообщения
453
Благодарностей
86
Баллы
28
UPD если использовать выносить Tab за пределы потока то ошибок вообще никаких не возникает но данные не обновляются. Если же в отдельном потоке использовать instance.ActiveTab то 1 запрос отрабатывает нормально и все больше не выполняется. Если детально посмотреть то вот вот tracerout

Тип Время Сообщение
03:03:17 Итерация завершена, a = 47
03:03:17 Итерация 47: Перед вызовом Check
03:03:17 Зашли в функцию Check
03:03:17 Перед получением трафика
03:03:17 " Ошибка при обработке трафика: Значение не может быть неопределенным.
Имя параметра: source"
03:03:17 " Стек ошибки: в System.Linq.Enumerable.Select[TSource,TResult](IEnumerable`1 source, Func`2 selector)
в Helpers.Test.<Check>d__12.MoveNext() в C:\Users\user\AppData\Local\Temp\CompilerFolder\ProjectMaker\A8e0648d4de284240bc471184a46c1fa0\mwigkuvx.9.cs:строка 101"
03:03:17 Функция Check завершена
03:03:17 Итерация 47: После вызова Check
03:03:17 Итерация 47: Перед Task.Delay
03:03:17 Итерация 47: После Task.Delay
03:03:17 Итерация завершена, a = 48
03:03:17 Итерация 48: Перед вызовом Check
03:03:17 Зашли в функцию Check
03:03:17 Перед получением трафика
03:03:17 " Ошибка при обработке трафика: Значение не может быть неопределенным.
Имя параметра: source"
03:03:17 " Стек ошибки: в System.Linq.Enumerable.Select[TSource,TResult](IEnumerable`1 source, Func`2 selector)
в Helpers.Test.<Check>d__12.MoveNext() в C:\Users\user\AppData\Local\Temp\CompilerFolder\ProjectMaker\A8e0648d4de284240bc471184a46c1fa0\mwigkuvx.9.cs:строка 101"
03:03:17 Функция Check завершена
03:03:17 Итерация 48: После вызова Check
03:03:17 Итерация 48: Перед Task.Delay
03:03:17 Итерация 48: После Task.Delay
03:03:17 Итерация завершена, a = 49
03:03:17 Итерация 49: Перед вызовом Check
03:03:17 Зашли в функцию Check
03:03:17 Перед получением трафика
03:03:17 " Ошибка при обработке трафика: Значение не может быть неопределенным.
Имя параметра: source"
03:03:17 " Стек ошибки: в System.Linq.Enumerable.Select[TSource,TResult](IEnumerable`1 source, Func`2 selector)
в Helpers.Test.<Check>d__12.MoveNext() в C:\Users\user\AppData\Local\Temp\CompilerFolder\ProjectMaker\A8e0648d4de284240bc471184a46c1fa0\mwigkuvx.9.cs:строка 101"
03:03:17 Функция Check завершена
03:03:17 Итерация 49: После вызова Check
03:03:17 Итерация 49: Перед Task.Delay
03:03:17 Итерация 49: После Task.Delay
03:03:17 Итерация завершена, a = 50
03:03:17 Цикл while завершен нормально
03:03:17 Блок finally: Завершили CheckTraffic с a = 50
03:03:17 Метод CheckTraffic полностью завершен


Sergodjan буду признателен если просветите, потому что внутрь сего чуда я заглянуть не могу. Вам больше известно как это все работает
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 262
Благодарностей
803
Баллы
113
Вы во всех потоках обращаетесь к instance.ActiveTab - это не имеет смысла, так как instance.ActiveTab - это текущая активная вкладка. Т.е. вы во всех потоках работайте с одной и тоже вкладкой

Вам нужно что подобное
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 559
Благодарностей
3 388
Баллы
113
Оно не рассчитано на асинхронную работу, вам надо лочить все объекты постера.
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
755
Благодарностей
210
Баллы
43
Почему у тебя нет кода , который стартует сбор трафика ?
Ты один раз забрал трафик, обнулив структуру и все на этом. Естественно следующие циклы выдадут пустоту.
 

SlipDez

Client
Регистрация
18.07.2018
Сообщения
453
Благодарностей
86
Баллы
28
Вы во всех потоках обращаетесь к instance.ActiveTab - это не имеет смысла, так как instance.ActiveTab - это текущая активная вкладка. Т.е. вы во всех потоках работайте с одной и тоже вкладкой

Вам нужно что подобное
Это синхронная работа, задача именно в фоне собирать трафик с 1 активной вкладки. Но надо это делать именно в фоне
 
Последнее редактирование:

SlipDez

Client
Регистрация
18.07.2018
Сообщения
453
Благодарностей
86
Баллы
28
Оно не рассчитано на асинхронную работу, вам надо лочить все объекты постера.
На сколько понимаю асинхронная работа не поддерживается? если надо лочить все объекты постера есть ли подход как это делать каждые 2-3с?Искал на форуме, вообще ничего не нашел. Кроме 1 темы без ответов.

Есть тема где рекомендуют выполнять клик для по плашке принятия куки если есть какой-то элемент(чтобы скрыть плашку). Почему такой подход работает асинхронно а вот сбор трафика нет.
+- код который использовался

C#:
```csharp
        public async void CapchaAsync()
        {
            await Task.Run(() =>
            {
                HtmlElement he = instance.ActiveTab.FindElementByXPath("//div[contains(@class, 'captcha_verify_container style__CaptchaWrapper')]", 0); //Путь к html элементу который ищем
                while (he.IsVoid) //В бесконечном цикле проверяем есть ли этот элемент на странице
                {
                    Thread.Sleep(1000); //Пауза между проверками в милисекундах
                    he = instance.ActiveTab.FindElementByXPath("//div[contains(@class, 'captcha_verify_container style__CaptchaWrapper')]", 0); //Обновляем переменную с элементом
                }
                project.SendErrorToLog("Налетели на капчу, делаем дела по ее убиранию", true);
                //Тут добавляем действия необходимые при налете на плашку
                CapchaAsync(); //Запускаем метод обратно в работу
            });

        }
```
Почему у тебя нет кода , который стартует сбор трафика ?
А выше не код написан?
Ты один раз забрал трафик, обнулив структуру и все на этом. Естественно следующие циклы выдадут пустоту.
А что надо было написать? GetTraffic возвращает IEnumerable<TrafficItem> и очищает трафик при повторном вызове должен возращать либо новый трафик либо null.

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

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
755
Благодарностей
210
Баллы
43
А выше не код написан?

А что надо было написать? GetTraffic возвращает IEnumerable<TrafficItem> и очищает трафик при повторном вызове должен возращать либо новый трафик либо null.


А что надо было, колдовать?
Должен... Обязан... :-)
Ну вот он и вернул null ... Где обработка этого ответа ?
Доки приводишь, а изучить их ? А примеры глянуть в них же... ?

Ты лезешь в асинхрон, не понимая даже как работать с монитором трафика, не отладив код в обычной процедуре.
Не используешь try, не используешь ожидание загрузки запросов, чекаешь каждую секунду, не запускаешь сбор трафика после его изъятия...

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

SlipDez

Client
Регистрация
18.07.2018
Сообщения
453
Благодарностей
86
Баллы
28
Должен... Обязан... :-)
Ну вот он и вернул null ... Где обработка этого ответа ?
Доки приводишь, а изучить их ? А примеры глянуть в них же... ?
я просто так документацию скидывал? Конечно, я ее изучал. Примеры изучены. Где твое решение?Языком чесать не мешки ворочить. Критиковать или указывать что делать => предложить решение. Если ты считаешь что я делаю неправильно покажи как правильно. Если видишь ошибки и знаешь как они решаются покажи где ошибки=>как исправить. А иначе смысл?

Ты лезешь в асинхрон, не понимая даже как работать с монитором трафика, не отладив код в обычной процедуре.
Не используешь try, не используешь ожидание загрузки запросов, чекаешь каждую секунду, не запускаешь сбор трафика после его изъятия...
foreach (var t in traffic) { project.SendInfoToLog(t.Url.ToString()); }
а это что? Внимательнее.


130973
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
755
Благодарностей
210
Баллы
43
С чего ты взял что от меня будут примеры/решения ? :-)
Попинаю тебя немного, а там и сам начнешь шевелиться в нужном направлении ;-)
Понимаю... Хочется готового решения... Но его не будет...
Просто для понимания... Асинхрон в зенке не приветствуется ни админами, ни разработчиками зенки, даже просто на уровне обсуждения. Тут помощи от них не будет... Обычные пользователи тоже не заморачиваются этим.
Да и более опытные тоже не заморачиваются, так как довольно сложно контролировать завершение асинхрона, а незавершенная процедура вызывает крах всего зеннопостера, даже если произошла как кажется в отдельном инстансте...

Вывод. Практиков по твоему вопросу, хрен да маленько, а вот таких балоболов-критиканов как я , достаточно :-) выбор за тобой, можешь игнорировать бессмысленную речь от таких как я, либо пытаться проверять подначки/теории заговора/обычный треп в своем коде... ;-)

Ты кстати не написал, нафига ты так заморачиваешься ? Ведь без конечной цели, довольно сложно вообще что то советовать.
 

SlipDez

Client
Регистрация
18.07.2018
Сообщения
453
Благодарностей
86
Баллы
28
Попинаю тебя немного, а там и сам начнешь шевелиться в нужном направлении ;-)
Просмотрел все связанные темы которые нашел, я уже не знаю куда дальше копать.

Да и более опытные тоже не заморачиваются, так как довольно сложно контролировать завершение асинхрона, а незавершенная процедура вызывает крах всего зеннопостера, даже если произошла как кажется в отдельном инстансте...
Не соглашусь. В кубиках не работает await но можно использовать Task отправляя задачи асинхронно и дожидаясь действий либо через Task.Run как поток. Незавершенная процедура не крашит зеннопостер. Краш зеннопостера происходит когда выскакивает необработанное исключение и главный поток вылетает. Чтобы этого не было можно обернуть всю конструкцию в try catch. В конце работы можно дождаться выполнения задачи через Wait() либо WaitAll либо комбинировать с токенами отмены либо вообще запускать поток который ограничен по времени, вариантов масса.Но в плане трафика это не работает, а почему вообще не понятно.


пытаться проверять
Как уже было сказано ранее я пробовал запускать и через Task.Run и через асинхронный код/с прокидыванием в owncode и без. Результат один - не работает!

Ты кстати не написал, нафига ты так заморачиваешься
DNA. Но если в общих чертах то изменение состояния в зависимости от выполненных request запросов
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
755
Благодарностей
210
Баллы
43
Вот ты говоришь что нужны зависимости от выполненных запросов... Но в твоем коде нет ожидания выполнения запроса, я об этом писал выше, но ты игнорируешь этот бесполезный треп ;-)
Запросы не выполняются мгновенно, могут и по 10-30 секунд выполнятся.
Как ты вообще собираешься анализировать в асинхроне такие запросы я вот хз... Ведь если ты не дождешься выполнения запроса, то забирая его из трафика, ты на следующей итерации в жизни не узнаешь его результат. А ожидая все запросы до их выполнения, вообще нет смысла в асинхроне, так как чекнуть состояние можно и между основной логикой, одной командой запустив процедуру из общего кода...

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

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 559
Благодарностей
3 388
Баллы
113
В кубиках не работает await
Потому что экшены - обычные функции.
Краш зеннопостера происходит когда выскакивает необработанное исключение и главный поток вылетает.
Любой падающий, сторонний, пользовательский поток Windows крашит постер. Но учитывайте, что асинхронный код - это необязательно создание потока Windows.
я просто так документацию скидывал? Конечно, я ее изучал. Примеры изучены.
У вас не то, что нет проверки на null, но и нет цикла для Refresh элементов.
 

SlipDez

Client
Регистрация
18.07.2018
Сообщения
453
Благодарностей
86
Баллы
28
Любой падающий, сторонний, пользовательский поток Windows крашит постер. Но учитывайте, что асинхронный код - это необязательно создание потока Windows.
Да, я когда экспериментировал и пробовал вызывать ошибку кубика через throw new Exception крашилась вся программа. Я немного разобрался ассинхронный это просто не блокирующее выполнение, а тот же Task.Run() запускается в отдельном потоке


У вас не то, что нет проверки на null, но и нет цикла для Refresh элементов.
Этот код я скинул как пример, что асинхронность также как и многопоточность почему-то не работает с трафиком. Если бы значение было null и не было проверки => вызвалось исключение => программа бы упала вся. Не понимаю зачем мне Refresh. Если имеется ввиду обновления TrafficItem если я прав это обновляет возвращает статус обновился ли текущий экземпляр класса(есть ли новые данные) TrafficItem представляющий 1 запрос тык


Если я добавлю проверки на null асинхронный код начнет работать?)
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
755
Благодарностей
210
Баллы
43
Ну то есть ты кидаешь как пример неработающий код, а кто то должен угадывать что же на самом деле у тебя там выполняется ?
А это ты нормально придумал, мы так сразу и не поняли ... ;-)
 

SlipDez

Client
Регистрация
18.07.2018
Сообщения
453
Благодарностей
86
Баллы
28
Ну то есть ты кидаешь как пример неработающий код, а кто то должен угадывать что же на самом деле у тебя там выполняется ?
А это ты нормально придумал, мы так сразу и не поняли ... ;-)
Я тебе видео отправил +- с тем же кодом как в 1 сообщении. Он работает! Но асинхронно не выполняется. Конечно, все видно, никакие буквы не обрезал. Просто CTRL C + CTRL + V.
130981

изучай. Подсказать где находится кубик c#?
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
755
Благодарностей
210
Баллы
43
Я тебе видео отправил +- с тем же кодом как в 1 сообщении. Он работает! Но асинхронно не выполняется. Конечно, все видно, никакие буквы не обрезал. Просто CTRL C + CTRL + V.
Посмотреть вложение 130981

изучай. Подсказать где находится кубик c#?
Сделай видео по вставке кирпича c# , с таким же говенным разрешением, как и предыдущее и план минимум будет выполнен ;-)
 

SlipDez

Client
Регистрация
18.07.2018
Сообщения
453
Благодарностей
86
Баллы
28
Сделай видео по вставке кирпича c# , с таким же говенным разрешением, как и предыдущее и план минимум будет выполнен ;-)
этот кирпич хотя бы работает, пусть не асинхронно. Надеюсь твой также будет, что-то с зенкой разобрался как запускать?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)