C# 重定向页面时获取System.ObjectDisposedException

C# 重定向页面时获取System.ObjectDisposedException,c#,asp.net-core,entity-framework-core,razor-pages,C#,Asp.net Core,Entity Framework Core,Razor Pages,更新:问题是OnGet方法是异步的。谢谢大家的帮助和投入 在我的第一页(主页)中,我得到了一个用户列表: 主页模式: public async void OnGetAsync() { var everything = await _context.Users.ToListAsync(); GetUsers = everything; } 然后,我在页面上创建一个用户列表和一个链接,该链接重定向到包含另一个用户列表的页面: 网页:

更新:问题是OnGet方法是异步的。谢谢大家的帮助和投入

在我的第一页(主页)中,我得到了一个用户列表:

主页模式:

public async void OnGetAsync()
    {
            var everything = await _context.Users.ToListAsync();
            GetUsers = everything;
    }
然后,我在页面上创建一个用户列表和一个链接,该链接重定向到包含另一个用户列表的页面:

网页:

<ul class="list-group">
@foreach (var user in Model.GetUsers)
{
<li class="list-group-item">
    //Irrelevant stuff
    <a asp-page="./UserBets" asp-route-id="@user.Id">View Bets</a>
</li>
}
</ul>
当它到达那里时,我收到一条信息,上面写着:

System.ObjectDisposedException:'无法访问已处置的对象。此错误的一个常见原因是处理通过依赖项注入解析的上下文,然后在应用程序的其他位置尝试使用相同的上下文实例。如果对上下文调用Dispose(),或将上下文包装到using语句中,则可能会发生这种情况。如果您使用的是依赖项注入,那么应该让依赖项注入容器处理上下文实例。 对象名称:“AsyncDisposer.”

我试过不使用范围,在两个页面模型上都使用。 问题是,我并不真正理解这里的问题,所以如果我没有给你足够的上下文或代码,我很抱歉,但是问你是否需要更多

我想做的是打印一份用户下注列表。 提前谢谢

using (var db = _context)
{
    var everything = await _context.Bet.Where(a => a.UserId == Id).Select(s => s.MatchId).SingleAsync();
    GetBets = everything;
}
您的
使用
将在
GetBets=everything之后立即处理
\u上下文
行。问题是
\u context
不属于您的方法,因此使用
\u context
的任何其他代码都会发现它已被释放。我想其他地方也有类似的代码在处理它,这可能就是问题出现在这里的原因

在共享对象不再使用之前,不要处置它们(通常在包含类被销毁时-您应该在父类上添加自己的
IDisposable
实现)

您的
使用
将在
GetBets=everything之后立即处理
\u上下文
行。问题是
\u context
不属于您的方法,因此使用
\u context
的任何其他代码都会发现它已被释放。我想其他地方也有类似的代码在处理它,这可能就是问题出现在这里的原因


在共享对象不再被使用之前,不要处置它们(通常是在包含类被销毁时-您应该在父类上添加自己的
IDisposable
实现)。

异步void
通常是最好避免的,因为调用代码无法知道它何时完成。例如,您的
OnGetAsync
两种方法都将在将来的某个时间点设置
GetBets
GetUsers
属性。但是我们没有办法发现什么时候完成了,所以很可能您的代码中有更多是脆弱的,并且容易受到数据竞争的影响。就是这样,非常感谢!通常最好避免
async void
的可能重复,因为调用代码无法知道何时完成。例如,您的
OnGetAsync
两种方法都将在将来的某个时间点设置
GetBets
GetUsers
属性。但是我们没有办法发现什么时候完成了,所以很可能您的代码中有更多是脆弱的,并且容易受到数据竞争的影响。就是这样,非常感谢!我在另一个页面中有一个using块,可能是重复的。但该页面与这两者无关,尽管它使用的是相同的上下文。即使这两个页面(Home和UserBets)不与另一个页面“对话”,这是否会产生干扰?
\u context
是通过依赖项注入注入的单例吗?几乎可以肯定,
\u context
不“属于”您。处置它不是您的工作,所以不要使用
语句将它放入
。在
启动中
我将它添加到
配置服务中
服务.AddDbContext(选项=>选项.UseSqlServer(配置.GetConnectionString(“DefaultConnection”)
@aneko5-也请注意我在你的Q中的评论。看起来您没有正确使用
async
,因此可能在某些代码仍在运行时进行真正的清理/处置。我在另一个页面中有一个USE块。但该页面与这两者无关,尽管它使用的是相同的上下文。即使这两个页面(Home和UserBets)不与另一个页面“对话”,这是否会产生干扰?
\u context
是通过依赖项注入注入的单例吗?几乎可以肯定,
\u context
不“属于”您。处置它不是您的工作,所以不要使用
语句将它放入
。在
启动中
我将它添加到
配置服务中
服务.AddDbContext(选项=>选项.UseSqlServer(配置.GetConnectionString(“DefaultConnection”)
@aneko5-也请注意我在你的Q中的评论。看起来您没有正确地使用
async
,因此在某些代码仍在运行时,可能会发生真正的清理/处置。
using (var db = _context)
{
    var everything = await _context.Bet.Where(a => a.UserId == Id).Select(s => s.MatchId).SingleAsync();
    GetBets = everything;
}