Да, видел это, но это не потоки, их и нельзя использовать.Не работал с С# клиент-сайдом, но беглый поиск даёт примерно такие ответы
Посмотреть вложение 3648
Посмотреть вложение 3649
А кто точно работает с клиентсайдом на шарпе и может подсказать - так это @xDeveluxe
Да, я тоже все перепробовал.На клиенте нет возможности использования любого потока, кроме основного.
Полагаю, что это может быть сделано для защиты и безопасности.
Единственная опция на данный момент, как сказано выше - использовать таймеры, которые будут выполнять действия раз в N-ое количество времени, запихнуть его в другой поток не получится, во всяком случае так об этом прямо говорится везде, при моей попытке использовать как-либо потоки - игра застывает до её выключения через диспетчер, то есть это нельзя.
Конкретно, через setInterval я вызываю функцию в js зацикленно, основной поток игры не замораживаетсяДа, я тоже все перепробовал.
Как вариант нашел следующее:
В js работает setInterval, можно создавать события, содержащие определенный код, написанный тоже на js, на стороне JS клиента и вызывать их из C#, таким образом.
Мне нужно было написать скрипт для показывается пальцем на кнопку, соответственно постоянно надо отслеживать, в какую сторону смотрит игрок. Этот способ мне помог сейчас. Получается, что некоторые клиентские скрипты уже не будет возможности полностью написать на C#, будет эдакий гибрид.
С чего такой вывод? JS не имеет потоков в принципе, то есть ты всё равно будешь использовать основной поток игры, что в JS'е, что в C#.Конкретно, через setInterval я вызываю функцию в js зацикленно, основной поток игры не замораживается
Ну, я это только что проверил)С чего такой вывод? JS не имеет потоков в принципе, то есть ты всё равно будешь использовать основной поток игры, что в JS'е, что в 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++;
}
}
О, второй способ топ. Я его и пытался через дефолтный C# использовать, а про то, что подобное есть в самом рейдже не знал. СпасибоКакой т окульт личности, если шарп сразу делюкса зовут лул.
Могу предложить два варианта:
Первый создать свой аналог используя рендер, просто через определенные промежутки времени дергаешь нужный тебе делегат.
Второй WaitAsync.
Посмотреть вложение 3650C#: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++; } }
Есть предположение, что ты просто не так делал вызов метода, потому и замораживалось, ибо JS точно так же будет работать в основном потоке, ведь у него других и нет.Ну, я это только что проверил)
Ничего не замораживается, хотя происходит бесконечный вызов одного метода, пока зажата клавиша.
В С# сразу же все замораживалось и только закрытие процесса помогало.
Хз при чём тут культ личности, если просто человек знает, что я, возможно, смогу чем-то помочь по данному вопросу (или имею какую-либо информацию).Какой т окульт личности, если шарп сразу делюкса зовут лул.
Могу предложить два варианта:
Первый создать свой аналог используя рендер, просто через определенные промежутки времени дергаешь нужный тебе делегат.
Второй WaitAsync.
Посмотреть вложение 3650C#: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++; } }
Какой т окульт личности, если шарп сразу делюкса зовут лул.
Могу предложить два варианта:
Первый создать свой аналог используя рендер, просто через определенные промежутки времени дергаешь нужный тебе делегат.
Второй WaitAsync.
Посмотреть вложение 3650C#: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++; } }
Тут по факту.Правда глаз дёргается конечно от async void до сих пор по привычке.
Так лучше?Хз о чём ты, это в целом один из двух людей на форуме с кем я общаюсь за его рамками просто. Ну и чем и как занимается тоже знаю, офк.
Исходя из этого опыта - я почти уверен что если есть какой-то нерабочий метод в апишке - то скорее всего он об этом знает, только и всего.
Про async\await кстати настолько очевидный вариант, что даже обидно стало теперь, немного.
Правда глаз дёргается конечно от async void до сих пор по привычке.
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; }
}