Entity Framework 在 C# 中使用多线程(任务)导致问题

Entity Framework causing issue using Multithreading (Task) in C#

在我的 Asp.net MVC 3 应用程序中,使用 Entity Framework 6.0,我正在尝试使用异步方法更新数据库 table 记录:

public static async Task UpdateAssetLogAsync(string assetID)
{
    using (var context = new MyContext())
    {
        var log = await context.UploadedLogs.SingleAsync(e => e.AssetID == assetID);
        if (log != null)
        {
            log.LastUpdatedOn = DateTime.Now;
            await context.SaveChangesAsync();
        }
    }
}

不幸的是,代码执行在第 5 行即停止,即

var log = await context.UploadedLogs.SingleAsync(e => e.AssetID == assetID);

Visual Studio (2012) 完全没有显示错误,程序执行只是从这里中断。

谁能告诉我这是什么问题?

[编辑] 这是我的连接字符串

<add name="MyContext" connectionString="Server=.\SQLExpress;Database=Test;Max Pool Size=80;Integrated Security=true;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>

[编辑] 发生这种情况是因为连接字符串中有 'Integrated Security=true'。如果我在连接字符串中使用 sa 和密码选项,它工作正常。在我的 web.config 中已经定义了一个模拟上下文,它在 Task 外部工作正常,但在 Task 内部似乎模拟上下文不可用,导致 EF 无法连接。

使用异步方法生成的线程通常 return 任务或 Task<TResult>。不幸的是,默认情况下,调用者 的模拟上下文不会 传递给此线程。这可能就是您无法连接到数据库的原因 - 凭据错误。

您可以使用 IIS

中的 <alwaysFlowImpersonationPolicy> 通过 aspnet.config 文件设置传递模拟上下文

在您的代码中,使用 WindowsIdentityWindowsImpersonationContext 允许模拟上下文与异步线程一起流动。

以下是一些感兴趣的文章:

http://blog.codeishard.net/2012/09/17/await-async-mvc-and-impersonation/

How do I set the user identity for tasks when calling Task.WaitAll()?