.net 系统操作无效异常:'无效操作,连接已关闭,'

ddhy6vgd  于 2023-02-10  发布在  .NET
关注(0)|答案(2)|浏览(359)

我使用的是.net core 6.0。当我从不同位置调用同一方法时,我收到此错误。我尝试从Index内部调用此方法GetEmployeeByEmployeeNumber,但没有收到任何错误,该方法返回的对象employee的值填充为employee

public async Task<IActionResult> Index()
        {
           EmployeeInfo employee =  await _employeeService.GetEmployeeByEmployeeNumber(up.EmployeeId); 
            PopulatePDFDoc();
            return View();
        }


public async Task<EmployeeInfo?> GetEmployeeByEmployeeNumber(string employeeId)
        {
            List<int> emplyoeeInfoId = new List<int>();
            UserPrincipal up = utilities.UserADIdentity.GetADUserInfo(WindowsIdentity.GetCurrent().Name.ToString());

            emplyoeeInfoId = _ackContext.EmployeeInfos.Where(e => e.EmployeeNumber == employeeId).OrderBy(e => e.DateFormFilled).Select(e => e.EmployeeInfoId).ToList();

            var employee = await _ackContext.EmployeeInfos.Include(e => e.EmergencyInfos.Where(p => p.EmployeeInfoId.Equals(emplyoeeInfoId.LastOrDefault()))).Where(e=>e.EmployeeInfoId.Equals(emplyoeeInfoId.LastOrDefault())).FirstOrDefaultAsync();
            return employee;
       }

如果我从PopulatePDFDoc()内部调用相同的方法GetEmployeeByEmployeeNumber;然后我收到一个错误消息,系统.无效操作异常:'无效操作。连接已关闭。'
下面是我的PopulatePDFDoc

public  async void PopulatePDFDoc()
        {
            AckPackage.Data.PDFPopulate.DocPDF doc = new Data.PDFPopulate.DocPDF();
            EmployeeInfo employee =  await _employeeService.GetEmployeeByEmployeeNumber(up.EmployeeId);
            

        }

下面是错误的屏幕截图:我是新的。net核心。任何帮助这将是高度赞赏。

x7rlezfr

x7rlezfr1#

您需要在Index方法中awaitPopulatePDFDoc()的调用。
就像这样:

await PopulatePDFDoc();

调用async方法时始终使用await!
您得到"connection closed"错误的原因是,对PopulatePDFDoc()的调用没有被"等待",并且服务器请求在异步方法可以运行之前结束。
此外,PopulatePDFDoc()应返回Task而不是void,如下所示:

public async Task PopulatePDFDoc()
5sxhfpxr

5sxhfpxr2#

我注意到的另一个问题是你的_ackContext,它看起来像是一个基于你共享的代码片段的类范围内的成员变量,这意味着相同的context-instance在多个方法之间共享.然而,上下文本身实际上并不是“线程安全的”,这可以在微软的文档中读到:https://learn.microsoft.com/en-us/ef/ef6/fundamentals/working-with-dbcontext,这意味着如果多个异步方法使用相同的上下文(在您的示例中就是这样),您可能会遇到问题。
推荐的方法是在需要的时候创建上下文,并使用using语法确保在工作完成后正确地处理它。

using (var ackContext = new EmployeeContext())
{     
    // Perform data access using the context here
}

试着在你的GetEmployeeByEmployeeNumber方法中使用它,看看它是否也有帮助:)

相关问题