Как передавать данные клиентам из концентратора SignalR в C#

#c# #stream #signalr

#c# #поток #signalr

Вопрос:

Я использую код из примера MS:

         public Task PushMessage(string Message)
        {
            var T = Clients.All.SendAsync(Message);
            Console.WriteLine("I'm here");
            return T;
        }
 

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

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

прямо сейчас я поместил вызов SendMessage в событие, которое генерируется при создании новых данных, но это просто приводит к задержке обратного вызова, потому что SendMessage не возвращается.

поведение, которое я ищу: если есть клиенты, они получают сообщение, если клиентов нет, сообщение отбрасывается.

как я могу этого добиться?

Я думаю, что, возможно, я неправильно понимаю, как работает SignalR, и мне бы очень хотелось найти пример C # <-> C #, потому что каждый отдельный пример в Интернете ориентирован на web / js.

Комментарии:

1. Вы всегда можете использовать Clients.All.SendAsync (сообщение). Результат, если вы хотите увидеть возвращаемое значение SendAsync. Также я считаю, что вам следует проверить async и await.

2. Я не хочу видеть результат, я хочу отправить или уничтожить, если клиент не подключен. Вместо этого он остается зависшим до истечения времени ожидания, когда клиента нет

Ответ №1:

Просмотрите некоторые примеры кода для консольных приложений в их GitHub.

SignalR будет транслироваться только в том случае, если есть соединения для трансляции. Это часть смысла, поэтому вам не нужно управлять этим аспектом. Вы, конечно, можете опрашивать данные или получать их, как вам нравится, но когда вы скажете ему отправить SignalR проверит, есть ли кому их отправить.

Что касается C # на C # против C # на web / js, да, вы думаете об этом неправильно. Если это консольное приложение или web / js, это клиент. Связь осуществляется от клиента к серверу и от сервера (концентратора) к клиенту. Не имеет значения, является ли это консольным приложением или web / js или любым другим типом клиента.

Вот пример консольного приложения, которое я использую для демонстрационных целей, которое позволяет мне общаться между консолью и веб-страницей или веб-страницей на консоль через концентратор:

         private static void Main(string[] args)
    {
        try
        {

            var connection = new HubConnection("http://localhost:7132/");
            IHubProxy hub = connection.CreateHubProxy("ChatHub");

            hub.On<string, string>("broadcastMessage", (name, message) => { Console.Write(name   ": "); Console.WriteLine(message); });
            connection.Start().Wait();
            hub.Invoke("Notify", "Console app", connection.ConnectionId);
            string msg = null;

            while ((msg = Console.ReadLine()) != null)
            {
                hub.Invoke("Send", "Console app", msg).Wait();
            }

        }
        catch (Exception e)
        {
            Console.WriteLine("Error"   e.Message);
        }

    }
 

Комментарии:

1. Я знаю, что не имеет значения, какой тип клиента существует, но все образцы клиентов находятся в JS 🙂 Я не нашел ни одного в C #. Проблема, с которой я сталкиваюсь, заключается в том, что, когда нет клиента, мой широковещательный вызов не возвращается до истечения времени ожидания; Мне не нужен результат, но я не хочу, чтобы он удерживал поток, поскольку у меня есть 20-30 сообщений в секунду для отправки клиентам. Это для внутреннего приложения, к которому одновременно подключено около 3 клиентов. Я хотел бы знать, как просто уничтожить сообщение, если клиента нет, у меня не может быть тысяч сообщений, стоящих в очереди в ожидании тайм-аута

2. Может быть, предоставить больше кода? это снова из моего примера в концентраторе, и единственное, что мне нужно отправить туда и обратно: public void Send(строковое имя, строковое сообщение) { // Вызовите метод broadcastMessage для обновления клиентов. Clients.All.broadcastMessage(имя, сообщение); }

3. Я только что заметил, что другие ваши вопросы помечены как Signal-Core , где, поскольку это просто signalr (значение . NET, а не .NETCORE). Пожалуйста, имейте в виду, что мои ответы касаются версии .NET. Пример консольного приложения для .NETCORE можно найти здесь: github.com/aspnet/SignalR/blob/master/samples/ClientSample /…

4. ах, да, API выглядит по-другому, поскольку я создаю класс, производный от hub, регистрирую путь с помощью asp.net а об остальном мы позаботимся сами; никакой обработки соединения не происходит