[英]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.