Я реализовал приложение ASP.Core SignalR.
Класс общего концентратора вызывает сигнал всем своим клиентам каждые 10 секунд из класса SharedHub
(этот класс не наследуется от Hub
он имеет логику для получения IHubContext
для вызова)
public void Tick(){
var time = _context.table.time;
invoke('tick', time.tick);
}
Также в том же классе, когда новое соединение установило метод, вызываемый для обновления базы данных
public void UpdateSocketConnection(int connectionId){
var connection =_context.connection;
connection.id = connectionId;
_context.saveChanges();
}
Проблема с этой реализациейесли соединение в данный момент вызывает метод Tick()
, а также клиент, подключенный в то же время._context
выдает ошибку, говорящую:
_context используется.
(я обновлю точное сообщение об ошибке, как только воспроизведу).
ЧтоЯ сделал?
Я реализовал фабричный метод для получения нового экземпляра _context
поверх каждого метода
public void Tick(){
var time = factory.GetContext().time;
invoke('tick', time.tick);
}
public void UpdateSocketConnection(int connectionId){
var context = Factory.getContext();
var connection =context.connection;
connection.id = connectionId;
context .saveChanges();
}
Это фактически решило проблему.Но, похоже, это не правильно.Я не уверен в производительности, когда каждый раз получаю новый контекст поверх каждого метода.это кажется плохой практикой.
Я хочу знать, каковы возможные реализации этого сценария.