我正在为我使用 ASP.NET MVC 编写的应用程序使用 Entity Framework 。
我需要能够调用一个存储过程然后忘记它。我不关心结果我只想触发它。
我试图通过使用单独的连接来调用使用 ExecuteSqlCommandAsync
方法的存储过程来实现这一点。但是存储过程似乎并没有被解雇。
这是我的异步方法
protected async Task ProcessRecords(DateTime loadedAt, string email)
{
try
{
using (var conn = new AppContext())
{
var result = conn.Database.ExecuteSqlCommandAsync("EXEC [DedecatedProcesses] @p0, @p1;", loadedAt, email);
await Task.WhenAll(result);
}
}
catch (Exception e)
{
// Do something with e.Message
}
}
然后从 Controller 中的 Action 方法中我这样调用它
var loaded = ProcessRecords(DateTime.UtcNow, model.Email);
当我运行我的代码时我没有收到任何错误,但程序没有运行。
当我使用 SSMS 执行存储过程时,它运行没有任何问题。
如何正确调用存储过程而忘记它?
最佳答案
在回答你的问题之前,我想指出这一点:
您创建一个异步任务,如果“正确”使用,您将已经有一个异步调用。事先有什么问题吗?
回答:
await
是默认情况下不会结束当前上下文的调用。在这种情况下,您将在 try
结束时等待 ExecuteSqlCommandAsync
。
您可以按如下方式明确删除此行为:
protected async Task ProcessRecords(DateTime loadedAt, string email)
{
try
{
using (var conn = new AppContext())
{
await conn.Database.ExecuteSqlCommandAsync("DedecatedProcesses @p0, @p1;", loadedAt, email)
.ConfigureAwait(false);
}
}
catch (Exception e)
{
// Do something with e.Message
}
}
注意:没有必要在此处存储您的结果。
关于c# - 如何使用 C# 和 Entity Framework 执行存储过程并忘记它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42216103/