Search code examples
signalrsignalr-hub

SignalR - access clients from server-side business logic


I have a requirement to start a process on the server that may run for several minutes, so I was thinking of exposing the following hub method:-

public async Task Start()
{
     await Task.Run(() => _myService.Start());
}

There would also be a Stop() method that allows a client to stop the running process, probably via a cancellation token. I've also omitted code that prevents it from being started if already running, error handling, etc.

Additionally, the long-running process will be collecting data which it needs to periodically broadcast back to the client(s), so I was wondering about using an event - something like this:-

public async Task Start()
{
     _myService.AfterDataCollected += AfterDataCollectedHandler;
     await Task.Run(() => _myService.Start());
     _myService.AfterDataCollected -= AfterDataCollectedHandler;
}

private void AfterDataCollectedHandler(object sender, MyDataEventArgs e)
{
    Clients.All.SendData(e.Data);
}

Is this an acceptable solution or is there a "better" way?


Solution

  • You don't need to use SignalR to start the work, you can use the applications already existing framework / design / API for this and only use SignalR for the pub sub part.

    I did this for my current customers project, a user starts a work and all tabs belonging to that user is updated using signalr, I used a out sun library called SignalR.EventAggregatorProxy to abstract the domain from SignalR. Disclaimer : I'm the author of said library

    http://andersmalmgren.com/2014/05/27/client-server-event-aggregation-with-signalr/

    edit: Using the .NET client your code would look something like this

    public class MyViewModel : IHandle<WorkProgress>
    {
       public MyViewModel(IEventAggregator eventAggregator) 
       {
          eventAggregator.Subscribe(this);
       }
       public void Handle(WorkProgress message)
       {
          //Act on work progress
       }
    }