Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET核心信号器中管理DbContext生存期_C#_Asp.net Core_Signalr - Fatal编程技术网

C# 在ASP.NET核心信号器中管理DbContext生存期

C# 在ASP.NET核心信号器中管理DbContext生存期,c#,asp.net-core,signalr,C#,Asp.net Core,Signalr,我已经实现了一个ASP.Core信号器应用程序 共享集线器类每10秒向其所有客户端调用一个信号 从类SharedHub(该类不是从Hub继承的,它具有获取IHubContext以调用的逻辑) 同样在同一个类中,一旦一个新连接建立了一个方法来更新数据库 public void UpdateSocketConnection(int connectionId){ var connection =_context.connection; connection.id = connectio

我已经实现了一个ASP.Core信号器应用程序

共享集线器类每10秒向其所有客户端调用一个信号 从类
SharedHub
(该类不是从
Hub
继承的,它具有获取
IHubContext
以调用的逻辑)

同样在同一个类中,一旦一个新连接建立了一个方法来更新数据库

public void UpdateSocketConnection(int connectionId){
    var connection =_context.connection;
    connection.id = connectionId;
    _context.saveChanges();
}
此实现的问题在于,如果连接当前正在调用
Tick()
方法,并且客户端也同时连接<代码>\u上下文抛出一个错误,说明:

_使用中的上下文

(我将在复制后更新确切的错误消息)

我做了什么

我已经实现了一个工厂方法,以在每个方法之上获得一个新的
\u 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();
}
这实际上解决了问题。但这似乎不是正确的做法。我不确定每次在每个方法之上获取新上下文时的性能。这似乎是不好的做法


我想知道这个场景的可能实现是什么

在第一种方法中,操作之间同时共享
DbContext
,这会导致错误和意外结果。为了避免在第二种方法中每次都创建和处理
DbContext
DbContextPooling
可以提高性能

可以创建一个可重用实例池。它不会处理实例,而是返回池并将实例重置为其默认状态。因此,代码将首先检查池中是否有可用实例,而不是每次都创建一个新实例

您可以在
startup
类中的
Configure
方法中启用
DbContextPooling

services.AddDbContextPool<YourContext>(options => options.UseSqlServer(connection));
services.AddDbContextPool(options=>options.UseSqlServer(connection));

默认池大小值为128。阅读以了解更多信息。

能否显示中心声明和
\u上下文的初始化?
services.AddDbContextPool<YourContext>(options => options.UseSqlServer(connection));