Signalr 信号器-从服务器端业务逻辑访问客户端

Signalr 信号器-从服务器端业务逻辑访问客户端,signalr,signalr-hub,Signalr,Signalr Hub,我需要在服务器上启动一个可能运行几分钟的进程,因此我考虑公开以下集线器方法:- public async Task Start() { await Task.Run(() => _myService.Start()); } 还有一个Stop()方法,允许客户端停止正在运行的进程,可能是通过取消令牌。我还省略了阻止它在已经运行时启动的代码、错误处理等 此外,长时间运行的进程将收集需要定期广播回客户端的数据,因此我想知道如何使用一个事件—类似这样的事件:- public async

我需要在服务器上启动一个可能运行几分钟的进程,因此我考虑公开以下集线器方法:-

public async Task Start()
{
     await Task.Run(() => _myService.Start());
}
还有一个
Stop()
方法,允许客户端停止正在运行的进程,可能是通过取消令牌。我还省略了阻止它在已经运行时启动的代码、错误处理等

此外,长时间运行的进程将收集需要定期广播回客户端的数据,因此我想知道如何使用一个事件—类似这样的事件:-

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);
}

这是一个可接受的解决方案还是有一个“更好”的方法?

您不需要使用SignalR来开始工作,您可以使用已有的框架/设计/API应用程序来完成这项工作,并且只对发布子部分使用SignalR

我这样做是为了我当前的客户项目,一个用户开始工作,属于该用户的所有选项卡都使用signalr更新,我使用一个名为signalr.EventAggregatorProxy的out sun库从signalr中提取域。免责声明:我是上述图书馆的作者

编辑:使用.NET客户端时,您的代码将如下所示

public class MyViewModel : IHandle<WorkProgress>
{
   public MyViewModel(IEventAggregator eventAggregator) 
   {
      eventAggregator.Subscribe(this);
   }
   public void Handle(WorkProgress message)
   {
      //Act on work progress
   }
}
公共类MyViewModel:IHandle
{
公共MyViewModel(IEventAggregator事件聚合器)
{
eventAggregator.Subscribe(此);
}
公共无效句柄(工作进度消息)
{
//按工作进度行事
}
}

我的客户机是一个WPF应用程序。您的库是与.Net客户端一起工作还是仅用于javascript客户端?是的,还有一个.Net客户端,