Всем привет! Не могу вызвать в клиентской части вызывать Events.CallRemote, код следующий:
C#:
private async void RegisterAccount(object[] args)
{
var social_club_id = (string)args[0];
Console.WriteLine($"Got social ID: {social_club_id} from UI");
_networkManager.SendDataToServer("RegisterAccount", social_club_id); // ОБРАТИМ СЮДА ВНИМАНИЕ
}
Тут ошибок нет, и собственно вот тут где вызывается метод:
C#:
using RAGE;
using RAGE.Game;
namespace staterp_client.Core.Networking
{
public class NetworkManager
{
public Task SendDataToServer(string eventName, object data)
{
return Events.CallRemote(eventName, data); // <--- тут ошибка
}
}
}
Ошибка:
Код:
CS0029: Не удается неявно преобразовать тип "void" в "RAGE.Task".
Ну чтож, давай разберём.
Во-первых, зачем оборачивать метод и при этом в своей реализации не иметь никакого дополнительного кода?
Иными словами зачем вообще нужен метод SendDataToServer, если ты точно так же можешь использовать Events.CallRemote из любого файла?
В данной реализации это "код ради кода" - так делать не стоит. Допускаю, что ты просто таким образом решил "показать пример", но сомневаюсь.
В этой реализации нет смысла от этого метода, удали его вовсе и используй Events.CallRemote напрямую.
Во-вторых, компилятор тебе буквально говорит что за ошибка и почему она вылезает, ты пробовал её читать?
Компилятор говорит "не могу преобразовать void в RAGE.Task", о чём это должно тебе сигнализировать?
Твой метод SendDataToServer должен вернуть RAGE.Task. Это значит, что внутри этого метода ты должен вернуть что-то, что равняется объекту RAGE.Task и является итогом работы метода.
Ты же пытаешься вернуть Events.CallRemote, который в свою очередь является void'ом, то есть не возвращает абсолютно ничего. Итого, если простыми словами, то ты не можешь вернуть "ничего" под видом "чего-то", понимаешь? Я утрирую, но лишь для того, чтобы лучше описать проблему. Нельзя из 0 яблок сделать 10.
Чтобы это исправить - тебе достаточно public Task заменить на public void и убрать изнутри return.
Это мы делаем по той причине, что в этом методе тебе не нужно ничего возвращать, как "результат выполнения", тебе нужно просто отправить на сервер ивент с данными и вернуться к предыдущему методу, который вызвал твою обёртку, чтобы продолжить работу.
В-третьих, в другом участке кода у тебя присутствует async void - это плохой тон и делать так не стоит, если ты точно не понимаешь, зачем нужно именно так.
По твоему коду видно, что ты не понимаешь, а значит такое решение было сделано "просто потому что я пытаюсь в асинхрон, но пока не понимаю что это такое".
Твой метод помечен асинхронным с помощью async, но при этом внутри метода ты не используешь await на методе, который в твоём примере помечен как Task, таким образом выполнение твоего Task метода SendDataToServer в асинхронном методе RegisterAccount будет выполняться синхронно, а в чём, собственно, тогда смысл асинхронности, которое ты пытаешься тут создать (неизвестно ради каких целей)?
В-четвёртых, ты создал метод RegisterAccount, который зарегистрировал как RemoteEvent (то есть он срабатывает, когда на него присылают данные либо с сервера, либо с CEF).
Если это метод для вызова с сервера, то странно, что ты отправляешь единственный аргумент SocialClubId, который сразу же после отправляешь назад на сервер, поэтому этот вариант отметаем.
Если это метод для вызова с CEF, то это ещё более странно, потому что CEF не знает ничего о Social Club данных или о каких-либо других данных игрока, а соответственно что ты хочешь получить в свою переменную - мне неизвестно. Ниже ты вывел лог с текстом "from UI", ну и, собственно, вот. UI не может отправить тебе Social Club данные, если ты их сам туда ранее не отправлял с этого же клиента.
Всё это даёт понимание того, что у тебя сейчас в голове просто каша и ты изучаешь, но попробуй почитать больше информации на эту тему, потому что сейчас вообще мимо.
В данном примере тебе не нужна ни асинхронность, ни потоки (Task'и) вообще, убрать ото всюду здесь и async, и Task, а так же использовать Events.CallRemote напрямую и продолжить изучение. Успехов в изучении.
Кстати, с тебя 5 тысяч ![j3r :j3r: :j3r:](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)