This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

Проблема [NAPI / C#] Не работает RAGE.Task.Runbackground(Action)

frytech

Участник портала
15 Янв 2022
128
13
53
Не работает данный метод, вообще ничего не делает.
Может кто то знает способы распараллелить некоторые задачи на клиентской части? На серверной это возможно, а как на клиентской?
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
3,799
1,858
208
35
Не работал с С# клиент-сайдом, но беглый поиск даёт примерно такие ответы






А кто точно работает с клиентсайдом на шарпе и может подсказать - так это @xDeveluxe
 
Последнее редактирование:

frytech

Участник портала
15 Янв 2022
128
13
53
Да, видел это, но это не потоки, их и нельзя использовать.
Меня интересует просто параллельный запуск определенных функций, чтобы я мог в фоне иметь задачу, которая выполняется в цикле и не грузит поток основной.
Это по-идее должен позволять RAGE.Task.RunBackground(), но он вообще ничего не выполняет.
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,766
1,581
211
28
На клиенте нет возможности использования любого потока, кроме основного.
Полагаю, что это может быть сделано для защиты и безопасности.
Единственная опция на данный момент, как сказано выше - использовать таймеры, которые будут выполнять действия раз в N-ое количество времени, запихнуть его в другой поток не получится, во всяком случае так об этом прямо говорится везде, при моей попытке использовать как-либо потоки - игра застывает до её выключения через диспетчер, то есть это нельзя.
 

frytech

Участник портала
15 Янв 2022
128
13
53
Да, я тоже все перепробовал.
Как вариант нашел следующее:
В js работает setInterval, можно создавать события, содержащие определенный код, написанный тоже на js, на стороне JS клиента и вызывать их из C# таким образом.
Мне нужно было написать скрипт для показывания пальцем на кнопку, соответственно постоянно надо отслеживать, в какую сторону смотрит игрок. Этот способ мне помог сейчас. Получается, что некоторые клиентские скрипты уже не будет возможности полностью написать на C#, будет эдакий гибрид.
 
Последнее редактирование:

frytech

Участник портала
15 Янв 2022
128
13
53
Конкретно, через setInterval я вызываю функцию в js зацикленно, основной поток игры не замораживается
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,766
1,581
211
28
С чего такой вывод? JS не имеет потоков в принципе, то есть ты всё равно будешь использовать основной поток игры, что в JS'е, что в C#.
 

frytech

Участник портала
15 Янв 2022
128
13
53
Ну, я это только что проверил)
Ничего не замораживается, хотя происходит бесконечный вызов одного метода, пока зажата клавиша.
В С# сразу же все замораживалось и только закрытие процесса помогало.
 

DaVilka

Старожил
BackEnd developer
16 Сен 2020
759
276
128
Какой т окульт личности, если шарп сразу делюкса зовут лул.

Могу предложить два варианта:
Первый создать свой аналог используя рендер, просто через определенные промежутки времени дергаешь нужный тебе делегат.
Второй WaitAsync.
C#:
private async void Tickddd()
{
    int ffff = 0;
    while (true)
    {
        RAGE.Ui.Console.Log(RAGE.Ui.ConsoleVerbosity.Info, $"Wait: {ffff}");
        await RAGE.Game.Invoker.WaitAsync(1000);

        ffff++;
    }
}
 

frytech

Участник портала
15 Янв 2022
128
13
53
О, второй способ топ. Я его и пытался через дефолтный C# использовать, а про то, что подобное есть в самом рейдже не знал. Спасибо
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,766
1,581
211
28
Есть предположение, что ты просто не так делал вызов метода, потому и замораживалось, ибо JS точно так же будет работать в основном потоке, ведь у него других и нет.


Хз при чём тут культ личности, если просто человек знает, что я, возможно, смогу чем-то помочь по данному вопросу (или имею какую-либо информацию).
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
3,799
1,858
208
35

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

Про async\await кстати настолько очевидный вариант, что даже обидно стало теперь, немного.
Правда глаз дёргается конечно от async void до сих пор по привычке.
 
Последнее редактирование:

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,766
1,581
211
28

DaVilka

Старожил
BackEnd developer
16 Сен 2020
759
276
128
Так лучше?
C#:
private async void pressJ()
        {
           await GetTestValue();
        }
        private async System.Threading.Tasks.Task GetTestValue()
        {
            try
            {
                var retTask = await TestTask();
                RAGE.Ui.Console.Log(RAGE.Ui.ConsoleVerbosity.Info, $"Wait: {retTask}");
            }
            catch { }
        }
        private async System.Threading.Tasks.Task<string> TestTask()
        {
            try
            {
                await RAGE.Game.Invoker.WaitAsync(1000);
                var ret = "Hello World";
                return ret;
            }
            catch { return null; }
        }
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
3,799
1,858
208
35
Да в целом-то если это евент типа нажатия на кнопку то плевать
хз как именно это хочет автор использовать
 
Последнее редактирование: