我使用的是.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核心。任何帮助这将是高度赞赏。
2条答案
按热度按时间x7rlezfr1#
您需要在
Index
方法中await
对PopulatePDFDoc()
的调用。就像这样:
调用
async
方法时始终使用await
!您得到"connection closed"错误的原因是,对
PopulatePDFDoc()
的调用没有被"等待",并且服务器请求在异步方法可以运行之前结束。此外,
PopulatePDFDoc()
应返回Task
而不是void
,如下所示:5sxhfpxr2#
我注意到的另一个问题是你的
_ackContext
,它看起来像是一个基于你共享的代码片段的类范围内的成员变量,这意味着相同的context
-instance在多个方法之间共享.然而,上下文本身实际上并不是“线程安全的”,这可以在微软的文档中读到:https://learn.microsoft.com/en-us/ef/ef6/fundamentals/working-with-dbcontext,这意味着如果多个异步方法使用相同的上下文(在您的示例中就是这样),您可能会遇到问题。推荐的方法是在需要的时候创建上下文,并使用
using
语法确保在工作完成后正确地处理它。试着在你的
GetEmployeeByEmployeeNumber
方法中使用它,看看它是否也有帮助:)