【问题标题】:Entity Framework 6 System.Threading.ThreadAbortException实体框架 6 System.Threading.ThreadAbortException
【发布时间】:2018-05-29 16:11:59
【问题描述】:

在单元测试方法中,每当我调用SaveChangesSaveChangesAsync(在实体框架6 DbContext 实例上)在另一个异步方法调用(如SingleOrDefaultAsync 或@)之后,我都会系统地获得ThreadAbortException 987654327@.

看起来在与创建DbContext 实例的线程不同的线程上调用SaveChanges/SaveChangesAsync 是导致问题的原因,这很奇怪。据我所知,在 await 关键字之后执行代码由不同的工作线程继续执行这一事实并不罕见。

我的代码有什么问题?提前感谢您的回答!

using (var ctx = new MyContext())
{
    // worker thread id =  n
    SomeDto dto= await ctx.SomeDtoSet.Where(x => x.SomeDto Id == id).SingleOrDefaultAsync();
    // worker thread id =  n + 1
    ctx.SaveChanges();
    // ctx.SaveChangesAsync(); behaves similarly
}

【问题讨论】:

  • 多个线程是否同时使用同一个数据库上下文实例?在示例代码中没有显示您如何使用线程。请在您的问题中包含问题的Minimal Complete Verifiable Example

标签: c# asynchronous async-await entity-framework-6


【解决方案1】:

可能使用 MyContext 的多个线程。您可能会创建新实例并尝试使用它。你能用try-catch检查一下吗

using (var ctx = new MyContext()){
try{
// worker thread id =  n
SomeDto dto= await ctx.SomeDtoSet.Where(x => x.SomeDto Id == id).SingleOrDefaultAsync();
// worker thread id =  n + 1
ctx.SaveChangesAsync();
catch (ThreadAbortException ex)
{
Thread.ResetAbort();
}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2015-12-26
    • 2014-11-08
    • 2014-04-04
    • 2015-10-10
    • 2014-07-28
    相关资源
    最近更新 更多