[英]Sending server generated events to the client
我有一个Hub
:
public sealed class NewValueHub : Hub
{
private IDataRelay _dataRelay;
private IConfig _configurator;
public NewValueHub(IDataRelay dataRelay, IConfig configurator)
{
_dataRelay = dataRelay;
_configurator = configurator;
_dataRelay.NewData += HandleNewData; //this gets unassigned on dispose.
}
public string GetMachineID()
{
IReadOnlyDictionary<string, string> config = _configurator.GetReadOnlyConfig();
string id;
if (config.TryGetValue("machineID", out id))
{
return id;
}
throw new HubException(Resource.machine_id_error);
}
private void HandleNewData(object? sender, string value)
{
Clients.All.SendAsync("ValueUpdate", value);
}
}
还有一个 javascript 客户端:
const connection = new signalR.HubConnectionBuilder().withAutomaticReconnect().withUrl("/newValueHub").build();
connection.on("ValueUpdate", function(value) { console.log(value); });
async function run(connection)
{
try
{
await connection.start();
let machineid = await connection.invoke('GetMachineID');
console.log('machine id', machineid);
}
catch (err)
{
console.error(err);
}
}
run(connection);
我知道IDataRelay
正在工作,因为另一个线程正在将值记录到文件中。
当我加载页面时,控制台会记录机器 ID,所以我知道connection
有效。
但是,我从未在控制台中看到任何新值。
我知道集线器不存在很长时间,这可能是问题所在,那么我打算如何处理服务器事件?
我的意思是,当有来自IDataRelay
的数据时,我怎样才能让 signalR 将其发送给我的客户?
在您的情况下,您没有需要等待的循环,因此您可以连接事件处理程序。
我不明白 HandleNewData 事件来自哪里。
根据davidfowl 的建议,我添加了一个处理事件的IHostedService
。
public class DataRelayWorker : IHostedService, IDisposable
{
private readonly IDataRelay _dataRelay;
private readonly IHubContext<NewValueHub> _hubcontext;
public DataRelayWorker(IDataRelay dataRelay, IHubContext<NewValueHub> context)
{
_dataRelay = dataRelay;
_dataRelay.NewData += BoadcastValue;
_hubContext = context;
}
private void BroadcastValue(object? sender, string value)
{
_hubcontext.Clients.All.SendAsync("ValueUpdate", value);
}
public void Dispose()
{
_dataRelay.NewData -= BoadcastValue;
}
}
这是通过将以下内容添加到Program.cs
来运行的
builder.Services.AddHostedService<DataRelayWorker>();
我已经从集线器中删除了与IDataRelay
的任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.