Polling vs. SignalR: A Detailed Comparison

 Polling vs. SignalR: A Detailed Comparison

Both Polling and SignalR are techniques used to fetch or receive real-time updates from a server, but they work differently. Here’s a comprehensive comparison to help you choose the right approach.


1. Overview


2. How They Work

Polling

  • The client repeatedly sends requests at fixed intervals (e.g., every 5 seconds).
  • The server responds with data (whether there are changes or not).
  • If no new data, the response is wasted network traffic.

🔹 Example (Polling in .NET Core)

public async Task<List<Message>> PollMessagesAsync()
{
    using var httpClient = new HttpClient();
    var response = await httpClient.GetAsync("https://api.example.com/messages");
    return await response.Content.ReadAsAsync<List<Message>>();
}

Problem: If data updates once every minute, but polling occurs every 5 seconds, that’s 11 wasted requests before useful data arrives.


SignalR

  • The client establishes a persistent connection with the server.
  • The server pushes updates to the client only when new data is available.
  • Uses WebSockets (or falls back to Server-Sent Events or Long Polling if WebSockets isn’t supported).

🔹 Example (SignalR in .NET Core)

1️⃣ Server-Side (Hub)

using Microsoft.AspNetCore.SignalR;

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

2️⃣ Client-Side (JavaScript)

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chatHub")
    .build();

connection.on("ReceiveMessage", (user, message) => {
    console.log(`${user}: ${message}`);
});

await connection.start();
console.log("Connected to SignalR");

Advantage: Updates instantly when new messages arrive—no need for repeated requests.


3. Performance Comparison


4. When to Use Polling vs. SignalR


5. Example: Polling vs. SignalR in a Live Chat App

Polling Approach

  • The client requests new messages every 5 seconds.
  • If no messages exist, the server still sends an empty response.
  • Inefficient when chat activity is low.

🔹 Example (Polling)

public async Task<List<Message>> PollChatMessagesAsync()
{
    using var httpClient = new HttpClient();
    var response = await httpClient.GetAsync("https://api.example.com/chat/messages");
    return await response.Content.ReadAsAsync<List<Message>>();
}

SignalR Approach

  • The client stays connected.
  • When a user sends a message, the server immediately pushes it to all clients.

🔹 Example (SignalR)

1️⃣ Server-Side (ChatHub)

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

2️⃣ Client-Side (JavaScript)

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chatHub")
    .build();

connection.on("ReceiveMessage", (user, message) => {
    console.log(`${user}: ${message}`);
});

await connection.start();
console.log("Connected to SignalR");

Benefit: Chat messages are delivered instantly.


6. Which One Should You Use?


7. Conclusion


Final Recommendation

If real-time performance and efficiency are important, SignalR is the best choice. If updates are rare and you don’t want to manage WebSockets, polling is acceptable.

Comments